WPF: Создание MinWidth / MinHeight дочерних элементов ограничить окно - PullRequest
6 голосов
/ 08 марта 2011

У меня есть окно WPF, которое содержит UserControl с MinWidth и MinHeight. Как я могу предотвратить изменение размера окна пользователем до уровня, при котором минимальный размер этого пользовательского элемента управления нарушается?

Вот упрощенная версия окна, над которым я работаю. UserControl моего реального приложения заменяется на Border:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <DockPanel>
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
      <Button Content="OK"/>
      <Button Content="Cancel"/>
    </StackPanel>
    <Border BorderBrush="Green" BorderThickness="10"
            MinWidth="200" MinHeight="150"/>
  </DockPanel>
</Window>

Если я уменьшу окно достаточно маленьким, правый и нижний края границы будут обрезаны. Я хочу, чтобы окно не стало таким маленьким - я хочу, чтобы минимальный размер моего окна был точно точкой, в которой граница имеет ее минимальный размер. Некоторые фреймворки (например, Delphi VCL) автоматически агрегируют минимальные размеры дочерних элементов управления вплоть до окна; Я ожидал, что WPF сделает то же самое, но это явно не так.

Я всегда мог явно установить значения MinWidth и MinHeight окна, но для их правильного расчета мне пришлось бы учитывать фактическую высоту кнопок, что означало бы ожидание хотя бы одного прохода макета (или вызов Measure) вручную. Грязное.

Есть ли лучший способ предотвратить слишком малое изменение размера окна для его содержимого?

Ответы [ 2 ]

6 голосов
/ 14 марта 2011

Самый простой способ, который я нашел, - указать окну размер его содержимого:

<Window ... SizeToContent="WidthAndHeight" ...>

, а затем, как только будет выполнено изменение размера (которое будет учитывать MinWidth и MinHeight дочерних элементов), запустите некоторый код, который устанавливает MinWidth и MinHeight для ActualWidth и ActualHeight окна. Также рекомендуется отключить SizeToContent, чтобы размер окна не изменялся при изменении его содержимого.

Следующий вопрос: куда поместить этот код? Я наконец остановился на OnSourceInitialized:

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    MinWidth = ActualWidth;
    MinHeight = ActualHeight;
    ClearValue(SizeToContentProperty);
}

Я также пробовал событие Loaded, но в моем случае это было слишком рано - Loaded происходит до того, как привязки данных были оценены, и у меня были привязки данных, которые повлияли на мой макет (метка с привязкой для его содержимого - его размер изменилось после вступления в силу привязки). Перемещение кода в OnSourceInitialized, который срабатывает после привязки данных, устранил проблему.

(были также другие события, которые запускались после привязки, но до того, как было показано окно - SizeChanged и LayoutUpdated - но они оба запускаются несколько раз, как показано в окне, и снова позже, если пользователь изменяет размер окна; OnSourceInitialized только один раз, что я считаю идеальным.)

0 голосов
/ 08 марта 2011

Вы пытались использовать привязку стиля ElementName из окна к UserControl под рукой?Кажется, что было бы целесообразно привязать MinWidth / Height окна к значениям кнопки.Все еще не красиво, но это не должно требовать дополнительных проходов, когда привязка установлена, и адаптируется, если вы измените значения на кнопке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...