WPF 滚动查看器大小调整问题



我在 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 中没有任何内容指定它。