7

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

我已经看到了几个答案/解决方案:

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

根据子属性设置表单 MinWidth 和 MinHeight

然而:

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

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

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

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

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

但它不起作用..

有人可以解释为什么吗?有符合我标准的解决方案吗?

谢谢,

标记

4

2 回答 2

11

你的代码:

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

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

您可以尝试的第一件事是:更改Mode=OneTimeMode=Default,以便 WPF在调整窗口大小MinHeight时可以更新。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;
     }
}

希望它能解决你的问题。或者至少会给你一些关于如何进行的想法。如果要固定窗口的大小,也可以MaxHeightWindow_SizeChanged()处理程序中设置。


仅 XAML 解决方案

<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>
于 2011-01-06T11:37:36.183 回答
0

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

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

这会将 Height 和 Width 设置为 MinHeight 和 MinWidth 集。所以你只有一个位置可以改变。

于 2013-02-10T16:56:01.573 回答