我在WPF窗口中有一个滚动查看器,无论我做什么,都会根据其内容调整大小。这是一个问题,因为它也会调整我的窗口大小,在我看来,它会失去滚动查看器的目的。
有问题的窗口将SizeToContent设置为“WidthAndHeight”,我知道可以设置为“手动”来解决滚动查看器问题,但是我必须调整窗口布局。
有没有办法在这里充分利用这两个世界?我想要的只是滚动查看器在内容发生变化时保持相同(当前)大小。
修改 如果你真的需要看到它......
<Window SizeToContent="WidthAndHeight">
<Grid Width="200" Name="ThinkBeforeSpeaking">
<ScrollViewer VerticalScrollBars="Auto" HorizontalScrollBars="Auto">
<ContentControl Content={Binding AnythingYouCanImagine}"/>
</ScrollViewer>
</Grid>
</Window>
不需要是查看器内部的内容控件,只需要比任何维度中的窗口都大。
答案 0 :(得分:3)
我自己刚刚遇到过这个问题,我找到了一个合适的解决方案,将ScrollViewer包装在Canvas中,这样它就不会参与测量传递,并告诉ScrollViewer使用ActualHeight和Canvas的ActualWidth使得它占用了Canvas的所有空间:
<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>
就目前而言,没有任何迹象表明窗口有任何高度,因此任何一个现有控件(Window,Grid或Canvas)都需要定义Height / MinHeight,或者需要添加其他控件来提供他们自己的身高/敏感度。
答案 1 :(得分:0)
我假设你希望你的Window的大小足够大以适应它的内容,但如果内容发生变化则不会调整大小。
如果是这样,你需要在加载Window时重置SizeToContent选项,如下所示:
public MainWindow() {
InitializeComponent();
this.Loaded += (s, e) => { this.SizeToContent = SizeToContent.Manual; };
}
答案 2 :(得分:0)
在您的示例中,您正在使用Window的WidthAndHeight行为。窗口的宽度将扩展到您在网格上设置的200px,但是您无法控制窗口需要具有的高度。
因此,除非您为ScrollViewer或Grid(或者Window和ScrollViewer之间的任何其他容器)指定固定的Height或MaxHeight,否则Window的高度将调整为ScrollViewer的内容。
<Window SizeToContent="WidthAndHeight">
<Grid Width="200" Height="150" Name="ThinkBeforeSpeaking">
<ScrollViewer VerticalScrollBars="Auto" HorizontalScrollBars="Auto">
<ContentControl Content={Binding AnythingYouCanImagine}"/>
</ScrollViewer>
</Grid>
</Window>
想一想,窗户有哪些高度?没有?无穷?您的XAML中没有任何内容可以指定它。