C# WPF。防止主窗口因调整大小而裁剪其包含的控件

C# WPF。防止主窗口因调整大小而裁剪其包含的控件,c#,wpf,resize,C#,Wpf,Resize,例如,我在MainWindow.xaml中有一个简单的标记: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Button Grid.Column="0" Margin="10" Width="300" />

例如,我在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>

我发现,任何FrameWorkelement的度量方法都会强制它计算它想要占用的空间,并考虑其所有子元素,然后将其存储到DesiredSize属性中。因此,我使用窗口的当前大小调用窗口最顶部元素的度量方法,在期望的大小中,我得到窗口中所有内容的最小大小。然后我将窗口的最小高度和最小宽度设置为这个最小大小值。它真的很管用

移除按钮“
高度”

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


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

删除按钮的高度

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


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

虽然@Dimitry M的解决方案有效,但有一种更简单的解决方案没有神奇的值。设置
SizeToContent=“WidthAndHeight”
并将事件侦听器绑定到窗口的
ContentRendered
事件:


这将强制窗口适应其内容,然后一旦渲染,我们通过将其最小大小设置为实际大小来防止向下调整大小

private void主窗口\u oncontentered(对象发送方,事件参数e)
{
最小宽度=实际宽度;
最小高度=实际高度;
}

虽然@Dimitry M的解决方案有效,但有一个更简单的解决方案没有神奇的值。设置
SizeToContent=“WidthAndHeight”
并将事件侦听器绑定到窗口的
ContentRendered
事件:


这将强制窗口适应其内容,然后一旦渲染,我们通过将其最小大小设置为实际大小来防止向下调整大小

private void主窗口\u oncontentered(对象发送方,事件参数e)
{
最小宽度=实际宽度;
最小高度=实际高度;
}

是的,但这是一个一般的例子。如果我希望窗口内的控件与我指定的大小完全一致,并且希望窗口在调整大小时不裁剪它们。@dmitrymarchuk这在物理上是不可能的。我不明白你在说什么。如果按钮宽度=50,窗口宽度=30,您预计会发生什么?当将窗口从X调整到30时,我希望它停止在50,而不是剪切按钮。将MinWidth\MinHight添加到网格和按钮是,但这是一个一般示例。如果我希望窗口内的控件与我指定的大小完全一致,并且希望窗口在调整大小时不裁剪它们。@dmitrymarchuk这在物理上是不可能的。我不明白你在说什么。如果Button Width=50,Window Width=30,您认为会发生什么?当将窗口从X调整到30时,我希望它停止在50,而不是剪切按钮。将MinWidth\MinHight添加到网格和Button这是一个非常干净的解决方案,即使对于MVVM也是如此。出于好奇,有没有办法通过绑定而不是代码隐藏来实现这一点?如果我将窗口的MinWidth绑定到视图的实际宽度,它仍然会略微切断视图。绑定到窗口的实际宽度根本不起作用。在触发
ContentRendered
事件后,某些组件的大小可能会发生变化。我对WPF不是很精通,但是如果组件(被切断)在其维度改变后触发事件,也许你可以听一下(假设事件冒泡)并相应地设置最小大小,这是一个非常干净的解决方案,即使对于MVVM也是如此。出于好奇,有没有办法通过绑定而不是代码隐藏来实现这一点?如果我将窗口的MinWidth绑定到视图的实际宽度,它仍然会略微切断视图。绑定到窗口的实际宽度根本不起作用。在触发
ContentRendered
事件后,某些组件的大小可能会发生变化。我对WPF不是很熟悉,但是如果组件(被切断)在其维度改变后触发事件,也许您可以听一下(假设事件冒泡),并相应地设置最小大小