我在 WPF 窗口中有一个滚动查看器,无论我做什么,它都会根据其内容调整大小。 这是一个问题,因为它也会调整我的窗口大小,在我看来,这违背了滚动查看器的目的。
有问题的窗口将其大小到内容设置为"宽度和高度",我知道可以将其设置为"手动"以解决滚动查看器问题,但是我必须去摆弄我的窗口布局。
有没有办法在这里两全其美? 我想要的只是滚动查看器在其内容更改时保持相同(其当前)大小。
编辑:如果你真的需要看到它.....
<Window SizeToContent="WidthAndHeight">
<Grid Width="200" Name="ThinkBeforeSpeaking">
<ScrollViewer VerticalScrollBars="Auto" HorizontalScrollBars="Auto">
<ContentControl Content={Binding AnythingYouCanImagine}"/>
</ScrollViewer>
</Grid>
</Window>
不需要是查看器内部的内容控件,只需在任一维度上都比窗口大的任何控件。
我自己刚刚遇到了这个问题,我找到了一个合适的解决方案,将 ScrollViewer 包装在画布中,这样它就不会参与测量传递,并告诉 ScrollViewer 使用画布的实际高度和实际宽度,以便它占用画布给定的所有空间:
<Window SizeToContent="WidthAndHeight">
<Grid Width="200" Name="ThinkBeforeSpeaking">
<Canvas>
<ScrollViewer VerticalScrollBars="Auto" HorizontalScrollBars="Auto"
Height="{Binding Parent.ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}"
Width="{Binding Parent.ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}">
<ContentControl Content={Binding AnythingYouCanImagine}"/>
</ScrollViewer>
</Canvas>
</Grid>
</Window>
就目前而言,没有任何内容告诉窗口有任何高度,因此现有控件之一(窗口、网格或画布)需要定义的高度/最小高度,或者需要添加其他控件,这将提供自己的高度/最小高度。
我假设您希望窗口开始调整大小以适合其内容,但是如果内容发生变化,它将不会调整大小。
如果是这样,则需要在加载窗口时重置"大小到内容"选项,如下所示:
public MainWindow() {
InitializeComponent();
this.Loaded += (s, e) => { this.SizeToContent = SizeToContent.Manual; };
}
在您的示例中,您使用的是 WidthAndHeight 的 Windows 行为。窗口的宽度将扩展到您在网格上设置的 200px,但随后您无法控制窗口需要具有的高度。
因此,窗口的高度将调整为滚动查看器的内容,除非您为 ScrollViewer 或网格(或窗口和滚动查看器之间的任何其他容器)指定固定的高度或最大高度。
<Window SizeToContent="WidthAndHeight">
<Grid Width="200" Height="150" Name="ThinkBeforeSpeaking">
<ScrollViewer VerticalScrollBars="Auto" HorizontalScrollBars="Auto">
<ContentControl Content={Binding AnythingYouCanImagine}"/>
</ScrollViewer>
</Grid>
</Window>
想想看,否则窗户会有多高?没有?无限?XAML 中没有任何内容指定它。