10

我希望窗口尊重MinWidth/MinHeightMaxWidth/MaxHeight里面的内容控件的规范。

有些人建议使用SizeToContent,但这仅有助于设置初始窗口大小,而不是约束。

其他人建议在那里覆盖MeasureOverride和设置窗口的最小/最大高度和宽度,但这似乎有点不干净,考虑到这样一个微不足道的问题肯定应该有一个纯粹的声明性解决方案。

只是提到另一个似乎合理但不起作用的解决方案(并且之前在一个被删除的答案中提到过):MinWidth将窗口绑定到MinWidth控件不考虑窗口装饰。

4

3 回答 3

7

如果设置了初始窗口大小,使得实际内容大小不会被初始布局过程中内容的 MinWidth/MinHeight 和 MaxWidth/MaxHeight 强制(例如,通过使用 Window.SizeToContent="WidthAndHeight"),则以下等式为真:

Window.ActualSize - Content.ActualSize = 
      Window.MinSize - Content.MinSize = Window.MaxSize - Content.MaxSize.

根据这些等式,您可以得出以下代码:

public MainWindow()
{
    InitializeComponent();

    this.SizeChanged += OnWindowSizeChanged;
}

private static void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    var window = (Window)sender;
    var content = (FrameworkElement)window.Content;

    window.MinWidth = window.ActualWidth - content.ActualWidth + content.MinWidth;
    window.MaxWidth = window.ActualWidth - content.ActualWidth + content.MaxWidth;

    window.MinHeight = window.ActualHeight - content.ActualHeight + content.MinHeight;
    window.MaxHeight = window.ActualHeight - content.ActualHeight + content.MaxHeight;

    window.SizeChanged -= OnWindowSizeChanged;
}

我不知道如何使用纯声明性方法有效地实现这一点,因为代码应该在初始布局通过后只运行一次。

于 2012-12-02T18:41:30.583 回答
5

有些人建议使用SizeToContent,但这仅有助于设置初始窗口大小,而不是约束。

我通过在窗口初始化MinWidth立即设置和MinHeight属性来解决这个问题:

主窗口.xaml

<Window ... SizeToContent="WidthAndHeight">
    ...
</Window>

主窗口.xaml.cs

public MainWindow()
{
    InitializeComponent();
    SourceInitialized += (s, e) =>
    {
        MinWidth = ActualWidth;
        MinHeight = ActualHeight;
    };
}
于 2015-01-13T19:09:45.357 回答
2

使用绑定标记扩展。绑定是 wpf 在此属性(源)更改时更新某些其他属性(目标)的方式。在这种情况下,Grid 的 MinWidth 属性是 Source,而您的窗口的 MinWidth 属性是目标。

<Window x:Class="MinMaxValuesOnWindows.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="600" Width="800"
    MinWidth="{Binding ElementName=gridy, Path=MinWidth}"
    MinHeight="{Binding ElementName=gridy, Path=MinHeight}"
    MaxWidth="{Binding ElementName=gridy, Path=MaxWidth}"
    MaxHeight="{Binding ElementName=gridy, Path=MaxHeight}">
    <Grid Name="gridy"  MinHeight="80" MinWidth="80" MaxHeight="300" MaxWidth="300"/>
</Window>

正如您在主题中提到的,这并不完全有效,但您可以在更新绑定目标之前使用绑定上的转换器来添加窗口框架的高度和宽度(可能需要 PInvoke)。由于我怀疑您的应用程序中的窗框厚度是动态变化的,因此这可能只是一个恒定值(如果用户更改主题,则不一定如此)。

于 2012-12-09T04:54:37.140 回答