按内容限制窗口大小

EFr*_*aim 9 wpf layout sizetocontent

我希望窗口尊重内部控件的MinWidth/ MinHeightMaxWidth/ MaxHeight规范.

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

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

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

Sti*_*ipo 7

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

Window.ActualSize - Content.ActualSize = 
      Window.MinSize - Content.MinSize = Window.MaxSize - Content.MaxSize.
Run Code Online (Sandbox Code Playgroud)

基于这些等式,您可以导出以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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


Chn*_*sos 5

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

我通过在初始化窗口设置MinWidthMinHeight属性来解决这个问题:

MainWindow.xaml

<Window ... SizeToContent="WidthAndHeight">
    ...
</Window>
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml.cs

public MainWindow()
{
    InitializeComponent();
    SourceInitialized += (s, e) =>
    {
        MinWidth = ActualWidth;
        MinHeight = ActualHeight;
    };
}
Run Code Online (Sandbox Code Playgroud)