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

时间:2011-01-06 11:17:52

标签: wpf resize binding sizetocontent css

我正在尝试根据其初始高度设置可调整大小窗口的MinHeight / MinWidth(当SizeToContent =“WidthAndHeight”时)。

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

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

Set form MinWidth and MinHeight based on child property

然而:

  1. 我正在尝试使用MVVM模式 并希望能够实现 这在xaml。

  2. 我还想保留价值观 比如MinHeight出了 ViewModel - 我不认为他们属于 在那里,他们绑在一个微不足道的部分 视图的行为 视图模型。我想留给UX设计师。

  3. 我正在努力解决的一个问题是使用以下xaml / binding:

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

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

    但它不起作用..

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

    谢谢,

    标记

2 个答案:

答案 0 :(得分:10)

您的代码:

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

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

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

否则,您必须处理SizeChanged事件,并在处理程序中更新MinHeight

<Window
            ....
            x:Name="mainWindow"
            SizeToContent="WidthAndHeight" 
            ResizeMode="CanResizeWithGrip"
            SizeChanged="Window_SizeChanged"
 >

在代码隐藏中:

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>

答案 1 :(得分:0)

我怀疑你正在寻找这段代码:

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

这会将“高度”和“宽度”设置为“MinHeight”和“MinWidth”设置。所以你只有一个职位可以改变。