Как мне вернуть пространство из "Захвата"

У меня есть StatusStrip с одним ToolStripStatusLabel, Spring=true и цвет фона для уведомлений.

Проблема в том, что на правой стороне полосы состояния есть уродливый серый квадрат. Немного поигравшись, я понял, что это размерный захват (у меня было установлено SizingGrip=false, GripStyle=Hidden). Тем не менее, даже когда он скрыт, он все еще поглощает пространство. Я не могу получить какой-либо контент на полосе состояния, чтобы расширить до вправо.

Как бы вы обойти это? Примечание. Я не могу просто установить задний цвет StatusStrip, поскольку метка состояния меняет цвета и имеет некоторые эффекты выцветания.

4 ответа

Решение

Свойство StatusStrip.Padding не используется, оно возвращает неправильное значение для Padding.Right, если захват размера отключен. Вы можете исправить это в конструкторе форм, например так:

public Form1() {
  InitializeComponent();
  statusStrip1.Padding = new Padding(statusStrip1.Padding.Left,
    statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom);
}

Использование свойства Left для указания Right - это исправление. Не пытайтесь отправить эту ошибку в Connect, они не исправят ее.

Посмотрите на эту запись в блоге на MSDN. Вопрос состоял в том, чтобы вручную изменить размер калибровочной ручки, и я думаю, что использование ToolStrip Renderer, как было предложено, может работать и для вас.

Проблема, которую я имею до сих пор, заключается в том, что он удаляет цвет фона на метке состояния в StatusStrip, так что это еще не решение, но это начало.

    public MyForm()
    {
        InitializeComponent();
        statusStrip1.Renderer = new MyRenderer();
    }

    private class MyRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e)
        {
            // don't draw at all
        }
    }

У меня была следующая проблема: когда я установил tsslSeparator.Spring = trueМоя правая метка исчезла сразу после того, как tsslSeparator потерял фокус. Проблема появилась при включении калибровки. Когда он был отключен, все работало просто отлично. Решение состояло в том, чтобы установить правое поле для правой метки на значение, отличное от 0.

tsslLogging.Margin = new Padding(0, 3, 2, 2); // this is necessary for right alignment of status bar label

Надеюсь, это кому-нибудь поможет.

Если Microsoft не заинтересована в ее исправлении, похоже, что правильное исправление должно обрабатывать все ориентации и в идеале исправлять все полоски состояния (см. Мой ответ на Get All Children для определения GetAllChildren)

    public static StatusStrip FixPadding(this StatusStrip ss) {
        if (!ss.SizingGrip) {
            var fixpad = ss.Padding;

            if (ss.Orientation == Orientation.Horizontal) {
                if (ss.RightToLeft == RightToLeft.No)
                    fixpad.Right = fixpad.Left;
                else
                    fixpad.Left = fixpad.Right;
            }
            else
                fixpad.Bottom = fixpad.Top;

            ss.Padding = fixpad;
        }

        return ss;
    }

    public static void FixStatusStripPadding(this Form f) {
        foreach (var ss in f.GetAllChildren().OfType<StatusStrip>())
            ss.FixPadding();
    }
Другие вопросы по тегам