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

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

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

Set form MinWidth and MinHeight based on child property

然而:

  • 我正在尝试使用 MVVM 模式
    并希望能够实现
    这在 xaml 中。
  • 我也想保值
    比如MinHeight出来的
    ViewModel - 我不认为它们属于
    在那里,因为他们绑了一个微不足道的部分
    View 的行为
    View 模型。这是我想留给 UX 设计师的东西。

  • 我正在努力解决的一个解决方案是使用以下 xaml/绑定(bind):
    <Window
            ....
            x:Name="mainWindow"
            SizeToContent="WidthAndHeight"
            ResizeMode="CanResizeWithGrip"
            MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
    >
    

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

    但它不起作用..

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

    谢谢,

    标记

    最佳答案

    您的代码:

    <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 解决方案
    <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>
    

    10-07 12:20