gpt4 book ai didi

WPF:使子元素的 MinWidth/MinHeight 约束窗口

转载 作者:行者123 更新时间:2023-12-04 15:03:56 26 4
gpt4 key购买 nike

我有一个 WPF 窗口,其中包含一个具有 MinWidth 和 MinHeight 的 UserControl。如何防止用户将 Window 的大小调整到违反 UserControl 的最小尺寸的程度?

这是我正在处理的 Window 的简化版本。我真正的应用程序的 UserControl 在这里被边框替换:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<Button Content="OK"/>
<Button Content="Cancel"/>
</StackPanel>
<Border BorderBrush="Green" BorderThickness="10"
MinWidth="200" MinHeight="150"/>
</DockPanel>
</Window>

如果我将窗口缩小到足够小,边框的右边缘和下边缘就会被切断。我想防止窗口变得那么小——我希望我的窗口的最小尺寸恰好是边框处于其最小尺寸的点。一些框架(如 Delphi VCL)自动将子控件的最小尺寸聚合到窗口;我希望 WPF 做同样的事情,但显然它没有。

我总是可以显式设置 Window 的 MinWidth 和 MinHeight,但要正确计算它们,我必须考虑 Button 的 ActualHeight,这意味着至少要等待一个布局 channel (或手动调用 Measure)。乱。

有没有更好的方法来防止 Window 对其内容调整得太小?

最佳答案

我发现的最简单的方法是告诉 Window 调整其内容的大小:

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

然后,一旦完成大小调整(将考虑子元素的 MinWidth 和 MinHeight),运行一些将 MinWidth 和 MinHeight 设置为窗口的 ActualWidth 和 ActualHeight 的代码。此时关闭 SizeToContent 也是一个好主意,以免窗口在其内容更改时调整大小。

下一个问题是,将这段代码放在哪里?我最终选择了 OnSourceInitialized:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
MinWidth = ActualWidth;
MinHeight = ActualHeight;
ClearValue(SizeToContentProperty);
}

我也尝试了 Loaded 事件,但在我的情况下,这还为时过早——加载发生在数据绑定(bind)被评估之前,并且我的数据绑定(bind)影响了我的布局(一个带有内容绑定(bind)的标签——它的大小在绑定(bind)生效)。将代码移动到 OnSourceInitialized(在数据绑定(bind)后触发)纠正了该问题。

(还有其他事件在绑定(bind)之后触发,但在窗口显示之前 - SizeChanged 和 LayoutUpdated - 但它们都会在窗口显示时触发多次,如果用户调整窗口大小,则会再次触发;OnSourceInitialized 仅触发一次,我认为这是理想的。)

关于WPF:使子元素的 MinWidth/MinHeight 约束窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com