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

7

我试图基于窗口初始化时的高度(当SizeToContent =“WidthAndHeight”时)设置可调整大小窗口的MinHeight / MinWidth。

我看到了一些回答/解决方案:

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

Set form MinWidth and MinHeight based on child property

然而:

  1. 我正在尝试使用MVVM模式, 并希望能够在xaml中实现此目标。

  2. 我还希望将诸如MinHeight之类的值保留在ViewModel之外-我认为它们不属于那里,因为它们将视图的微不足道的部分与ViewModel绑定。这是我想留给UX设计师处理的问题。

我正在尝试使用以下xaml /绑定解决方案:

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

我希望'Mode=OneTime'将MinHeight绑定到窗口高度的初始值。
但是它不起作用...
请问有人能解释一下原因吗?是否有符合我的要求的解决方案?
谢谢,
马克
2个回答

11

你的代码:

<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,如果可以解决问题,那么你就很高兴。

否则,你需要处理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;
     }
}

希望这能解决您的问题。或者至少会给您一些关于如何继续的想法。如果您想要固定窗口大小,那么您也可以在Window_SizeChanged()处理程序中设置MaxHeight


仅限 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>

1
这确实将MinHeight设置为非零值。然而,每当窗口调整大小时,它总是设置MinHeight,这意味着用户可以增加窗口的大小,但永远无法减小它。我正在尝试仅一次设置MinHeight - 到由“SizeToContent =”WidthAndHeight“确定的初始大小”。 - Mark W
也许有一种方法可以推迟绑定,直到窗口第一次调整大小。我能在xaml中做到这一点吗? - Mark W
1
+1,我正想发布类似的解决方案。不过我认为你应该将 SizeChanged 更改为 Loaded - Fredrik Hedblad
@Meleak:让Mark尝试使用“Loaded”事件。如果可以的话,那将是更好的解决方案。 - Nawaz
1
谢谢你们两个!仅使用XAML解决方案完美运行(将RoutedEvent设置为“Loaded”而不是“SizeChanged”)。非常有教育意义,干杯 :-) - Mark W
显示剩余4条评论

1
我猜您正在寻找这段代码:

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

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

这将把高度和宽度设置为最小高度和最小宽度。因此,您只需要更改一个位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接