WPF。由于调整大小,阻止MainWindow裁剪它包含的控件

时间:2013-06-15 15:26:03

标签: c# wpf resize

例如,我在MainWindow.xaml中有这个简单的标记:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Button Grid.Column="0" Margin="10" Width="300" />
    <Button Grid.Column="1" Margin="10" Width="300" />
</Grid>

当我启动应用程序并调整主窗口的大小时,我可以将其缩小到按钮状态。按钮的大小。

我尝试过设置MinWidth属性 - 这不起作用。唯一的方法是设置整个窗口的MinWidth,但它不是一个不易维护的解决方案。

更新
我经常找到一个解决方案 我为MainWindow SizeChanged添加了事件处理程序。使用以下代码:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    FrameworkElement topmost = (Content as FrameworkElement);
    topmost.Measure(new Size(ActualWidth, ActualHeight));
    MinHeight = topmost.DesiredSize.Height + 40;
    MinWidth = topmost.DesiredSize.Width;
}

我发现任何FrameWorkelement的Measure方法都会强制它计算它想要占用的空间,并占用它可以占用的给定空间量并考虑其所有子元素并将其存储到DesiredSize属性中。因此,我使用窗口的当前大小调用窗口最顶层元素的Measure方法,在DesiredSize中,我获得窗口中所有内容的最小大小。然后我将窗口的MinHeight和MinWidth设置为此最小大小值。它就是诀窍!

2 个答案:

答案 0 :(得分:0)

删除按钮'Height

<Button Grid.Column="0" Margin="10" />
<Button Grid.Column="1" Margin="10" />

这将导致按钮根据窗口大小调整大小。

答案 1 :(得分:0)

虽然@Dimitry M的解决方案有效,但是有一个更简单的解决方案,没有魔术值。设置SizeToContent="WidthAndHeight"并将事件侦听器绑定到Window的ContentRendered事件:

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

这将强制窗口适应其内容,然后在渲染后,我们通过将其最小尺寸设置为实际尺寸来防止缩小尺寸。

private void MainWindow_OnContentRendered(object sender, EventArgs e)
{
    MinWidth = ActualWidth;
    MinHeight = ActualHeight;
}