WPF - 尝试根据其初始高度设置可调整大小窗口的MinHeight

Mar*_*k W 7 css wpf binding resize sizetocontent

我试图根据其初始高度(当SizeToContent ="WidthAndHeight"时)设置可调整大小窗口的MinHeight/MinWidth.

我见过几个答案/解决方案:

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

根据子属性设置MinWidth和MinHeight形式

然而:

  1. 我试图使用MVVM模式,并希望能够在xaml中实现这一点.

  2. 我还希望将MinHeight之类的值保留在ViewModel之外 - 我不认为它们属于那里,因为它们将视图行为的一小部分与视图模型联系起来.这是我想留给UX设计师的东西.

我正在努力解决的一个解决方案是使用以下xaml/binding:

<Window
        ....
        x:Name="mainWindow"
        SizeToContent="WidthAndHeight" 
        ResizeMode="CanResizeWithGrip"
        MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>
Run Code Online (Sandbox Code Playgroud)

我希望'Mode = OneTime'将MinHeight绑定到窗口高度的初始值.

但它不起作用..

有人可以解释一下原因吗?有符合我标准的解决方案吗?

谢谢,

标记

Naw*_*waz 10

你的代码:

<Window
        ....
        x:Name="mainWindow"
        SizeToContent="WidthAndHeight" 
        ResizeMode="CanResizeWithGrip"
        MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为默认值ActualHeight为零,并且当WPF框架调整窗口大小时,它已经分配MinHeight了默认值ActualHeight为零!

您可以尝试的第一件事是:更改Mode=OneTimeMode=Default,以便在调整窗口大小MinHeightActualHeight更改WPF时可以更新.如果有效,那么你会很高兴.

否则,您将处理该SizeChanged事件,并在处理程序中可以更新MinHeight.

<Window
            ....
            x:Name="mainWindow"
            SizeToContent="WidthAndHeight" 
            ResizeMode="CanResizeWithGrip"
            SizeChanged="Window_SizeChanged"
 >
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

希望它能解决你的问题.或者至少会给你一些关于如何处理的想法.如果要修复窗口大小,则还可以MaxHeightWindow_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>
Run Code Online (Sandbox Code Playgroud)