防止WPF控制扩展到可见区域之外

我的用户控件中有一个ItemsControl,带有滚动浏览器,当它变得太大时(内容大于UserControl的可见区域)。问题是,它所有的网格正在不断扩展,以便滚动浏览器不会启动(除非我指定网格的确切高度)。请参阅下面的代码并提前感谢。

 <UserControl  x:Class="BusinessObjectCreationWizard.View.TableSelectionPageView"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <GroupBox FontWeight="Bold" Height="300px"
              Header="Tables"
              Padding="2">

        <ScrollViewer>

            <ItemsControl FontWeight="Normal" 
                          ItemsSource="{Binding Path=AvailableTables}">
                <ItemsControl.ItemTemplate>

                    <DataTemplate>              
                        <CheckBox Content="{Binding Path=DisplayName}"
                                  IsChecked="{Binding Path=IsSelected}"
                                  Margin="2,3.5" /> 
                    </DataTemplate> 
                </ItemsControl.ItemTemplate> 
            </ItemsControl>
        </ScrollViewer>
    </GroupBox>
</UserControl>

此用户控件在此处加载

<Border Background="White" Grid.Column="1" Grid.Row="0">
        <HeaderedContentControl Content="{Binding Path=CurrentPage}" 
                                Header="{Binding Path=CurrentPage.DisplayName}" />
</Border>

我不想指定高度。

如果您从GroupBox中删除Height(根据我的理解,您希望做什么),那么它将填满其容器,除非有上游的面板强加自己的大小规则。

我使用这个XAML的简化版本。我删除了模板和绑定,并硬编码了一些项目,使其独立;这些更改不会影响布局的完成方式。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2">
        <ScrollViewer>
            <ItemsControl FontWeight="Normal">
                <TextBlock>Foo</TextBlock>
                <TextBlock>Bar</TextBlock>
                <TextBlock>Baz</TextBlock>
            </ItemsControl>
        </ScrollViewer>
    </GroupBox>
</Window>

运行它,你会看到内容的大小适合窗口,滚动条只能在窗口太小而不能看到所有三个项目时启用。我相信这是你想要的。

所以这个问题很可能是一个父面板,一个你没有在你的示例XAML中显示。如果您的GroupBox出现在StackPanel中,则可能会出现此问题:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <StackPanel>
        <GroupBox FontWeight="Bold" Header="Tables" Padding="2">
            <ScrollViewer>
                <ItemsControl FontWeight="Normal">
                    <TextBlock>Foo</TextBlock>
                    <TextBlock>Bar</TextBlock>
                    <TextBlock>Baz</TextBlock>
                </ItemsControl>
            </ScrollViewer>
        </GroupBox>
    </StackPanel>
</Window>

现在,GroupBox出现在窗口的顶部,大小适合其内容。如果您缩小窗口,GroupBox将被切断 – 因为它的大小适合其内容,而不是其容器。这听起来像你正在描述的问题。

原因是StackPanel向孩子询问他们的理想身高(根据他们的内容),并使用这个高度。没有StackPanel(或类似的东西),默认是遵守控件的VerticalAlignment,如果设置为Stretch的默认值,则控件被拉伸以填充其父对象。这意味着它不会比父母高,听起来像你想要的。

解决方案:删除StackPanel(或任何其他导致您的问题),并使用别的东西。根据您要完成的任务,您可能会更喜欢DockPanel或Grid。很难说不知道你的布局。

编辑:好的,看起来这个问题确实是HeaderedContentControl的父 – 而不是直接。 HeaderedContentControl不是面板,所以它不会自己做任何布局(而且它的后代,GroupBox,没有这个同样的问题)。问题是它的默认模板 – 其中包括一个StackPanel。好消息是,您可以自由使用不同的模板,而不是使用DockPanel:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <HeaderedContentControl>
    <HeaderedContentControl.Style>
      <Style TargetType="{x:Type HeaderedContentControl}">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
              <DockPanel>
                <ContentPresenter ContentSource="Header" DockPanel.Dock="Top"/>
                <ContentPresenter/>
              </DockPanel>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </HeaderedContentControl.Style>
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2">
      <ScrollViewer>
        <ItemsControl FontWeight="Normal">
          <TextBlock>Foo</TextBlock>
          <TextBlock>Bar</TextBlock>
          <TextBlock>Baz</TextBlock>
        </ItemsControl>
      </ScrollViewer>
    </GroupBox>
  </HeaderedContentControl>
</Window>

如果你离开< HeaderedContentControl.Style>一部分,这会再现你的问题;但是随着风格到位,它允许GroupBox填充它的容器,所以当你想要的时候,ScrollViewer会得到一个滚动条。

http://stackoverflow.com/questions/4521508/prevent-wpf-control-from-expanding-beyond-viewable-area

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:防止WPF控制扩展到可见区域之外