WPF - Попытка установить MinHeight изменяемого размера окна на основе его начальной высоты - PullRequest
7 голосов
/ 06 января 2011

Я пытаюсь установить MinHeight / MinWidth изменяемого размера окна на основе его начальной высоты (когда SizeToContent = "WidthAndHeight").

Я видел пару ответов / решений:

http://weblogs.asp.net/psheriff/archive/2010/01.aspx

Установка формы MinWidth и MinHeight на основе дочернего свойства

Однако:

  1. Я пытаюсь использовать шаблон MVVM и хотел бы иметь возможность достичь это в xaml.

  2. Я также хотел бы сохранить значения такие как MinHeight из ViewModel - я не думаю, что они принадлежат там, как они связывают тривиальную часть поведение зрения на ViewModel. Это то, что я хотел бы оставить дизайнеру UX.

Решение, с которым я борюсь, заключается в использовании следующего xaml / binding:

<Window
        ....
        x:Name="mainWindow"
        SizeToContent="WidthAndHeight" 
        ResizeMode="CanResizeWithGrip"
        MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>

Я надеюсь, что «Mode = OneTime» свяжет MinHeight с начальным значением высоты окон.

Но это не работает ..

Может кто-нибудь объяснить, почему? Есть ли решение, которое соответствует моим критериям?

Спасибо

Mark

Ответы [ 2 ]

10 голосов
/ 06 января 2011

Ваш код:

<Window
        ....
        x:Name="mainWindow"
        SizeToContent="WidthAndHeight" 
        ResizeMode="CanResizeWithGrip"
        MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>

Это не будет работать, потому что значение по умолчанию ActualHeight равно нулю, и к тому времени, когда среда WPF изменяет размеры вашего окна, ей уже присвоено MinHeight сзначение по умолчанию ActualHeight, которое равно нулю!

Первое, что вы можете попробовать сделать, это: изменить Mode=OneTime на Mode=Default, чтобы WPF мог обновить MinHeight при изменении ActualHeight при изменении размераокно.Если это сработает, то вы будете счастливы.

В противном случае вам нужно обработать событие SizeChanged, а в обработчике вы можете обновить MinHeight.

<Window
            ....
            x:Name="mainWindow"
            SizeToContent="WidthAndHeight" 
            ResizeMode="CanResizeWithGrip"
            SizeChanged="Window_SizeChanged"
 >
* 1019.* В коде позади:
bool firstTime= true;
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
     FrameworkElement  element = sender as FrameworkElement;
     if ( firstTime)
     {
            element.MinHeight = e.NewSize.Height;
            firstTime= false;
     }
}

Надеюсь, это решит вашу проблему.Или, по крайней мере, даст вам некоторое представление о том, как действовать.Если вы хотите установить размер окна, вы также можете установить MaxHeight в обработчике Window_SizeChanged().


XAML ONLY SOLUTION

<Window
        x:Name="mainWindow"
        SizeToContent="WidthAndHeight" 
        ResizeMode="CanResizeWithGrip"
 >
 <Window.Triggers>
 <EventTrigger RoutedEvent="SizeChanged">
    <BeginStoryboard>
      <Storyboard Storyboard.TargetName="mainWindow">
            <DoubleAnimation Storyboard.TargetProperty="MinHeight" 
                             To="{Binding ElementName=mainWindow, Path=ActualHeight}"/>
       </Storyboard>
    </BeginStoryboard>
 </EventTrigger>
 </Window.Triggers>
 <!---- other code goes here--->
 </Window>
0 голосов
/ 10 февраля 2013

Я подозреваю, что вы ищете этот кусок кода:

<Window 
x:Name="myWindow" 
MinHeight="266" Height="{Binding ElementName=myWindow, Path=MinHeight}" 
MinWidth="480"  Width="{Binding ElementName=myWindow, Path=MinWidth}">

Устанавливает для высоты и ширины значения MinHeight и MinWidth. Таким образом, у вас есть только одна позиция для изменения.

...