WPF:使子元素’MinWidth/MinHeight约束Window
我有一个
WPF窗口,其中包含一个MinWidth和MinHeight的UserControl.如何防止用户将窗口大小调整到违反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,但为了正确计算它们,我必须考虑按钮的ActualHeight,这意味着等待至少一个布局传递(或手动调用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事件,但在我的情况下,那太早了 – 在数据绑定被评估之前发生了加载,并且我的数据绑定影响了我的布局(一个带有内容绑定的Label – 它的大小在绑定生效).将代码移动到OnSourceInitialized,在数据绑定后触发,纠正了问题. (还有其他事件在绑定后触发,但在显示窗口之前 – SizeChanged和LayoutUpdated – 但它们都会在显示窗口时多次触发,如果用户调整窗口大小,则会再次触发; OnSourceInitialized仅触发一次,我认为理想.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 窗口句柄(HWND)是唯一的,还是会被重用?
- windbg – 无法加载数据访问DLL,0x80004005
- 在Exchange Server上升级Windows Server版本
- windows-server-2012-r2 – DFS-R在克隆后创建420万个相同文
- Windows Azure – 硬盘大小
- windows-8.1 – 升级到“Windows 10”后返回“Windows 8.1”
- windows-server-2008 – 证书模板缺少“要发布的证书模板”
- Windows下Redis的安装与使用
- Windows任务调度程序在几秒钟内执行任务
- 跨越Windows的Windows域?
- 在Windows下Emacs糟糕的字体渲染
- windows-server-2012 – 计划任务未在Windows Se
- hyper-v – 相同硬件上的物理到虚拟?
- 在Windows命令中处理扩展字符?
- actionscript-3 – Windows上是否有针对Actionsc
- windows-server-2008 – 使用SMB2的2008 / 2008R
- Windows – 远程站点中的工作站不了解新的AD领域
- windows-server-2008 – 2008 GPO不能在2012服务
- windows-phone-7 – Windows推送通知服务 – 如何
- Windows网络共享上的GIT中央存储库