ScrollViewer中犯规时显示的数据超出了WPF父窗口(Scrollviewer doesnt

2019-10-21 21:58发布

有与我的主窗口6个扩展器(在一个膨胀器的每个ContentControl中)的单个网格,其调用各种用户控件来填充每个上接片/左菜单选择的主窗口内的一些6 contentcontrols。

一个扩张器将在同一时间内休息会崩溃。

每一个新的窗口将在ContentControl中。

问题是当我有更大的数据这就是动态加载我含量超过超出了父母控制,甚至当我使用的ScrollViewer,ScrollViewer中显示出来,但数据被切断。

这里是我的代码:以下是我在用户控件的代码,在主窗口的ContentControl中使用

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>
  <Expander Header="Settings" BorderBrush="SteelBlue" BorderThickness="5"
      IsExpanded="{Binding Path=ShowPreview, Mode=TwoWay}"
      Background="AliceBlue" FontFamily="Poor Richard" FontSize="24"
      FontWeight="Bold">
    <DatePicker Name="MyDateRange" />
  </Expander>
  <Expander Header="Permissions" Grid.Row="1" BorderBrush="SteelBlue"
      BorderThickness="5" Background="AliceBlue" FontFamily="Poor Richard"
              <local:Permissions /> 
        <!--/*Permissions is another usercontrol   with a grid layout  (a dataentry form)*/-->
   </Expander>
</Grid>

有6排第二格在我的主窗口的代码。

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Expander Grid.Row="1" IsExpanded="False" x:Name="Expander1"
      Style="{DynamicResource OutlookStyleExpanderStyle}" Visibility="Hidden">
    <Expander.Header>
      <WrapPanel HorizontalAlignment="Right" Margin="450,0,0,0">
        <Button Name="ExpandButtonMin" Background="#FFACD0EE"
            Click="ExpandButtonMin_Click" HorizontalAlignment="Right">
          <Image Source="/Images/Minimize_Box_Blue.png" Height="30" Width="30" />
        </Button>
        <Button Name="ExpandButtonMax" Background="#FFACD0EE"
            Click="ExpandButtonMax_Click" HorizontalAlignment="Right">
          <Image Source="/Images/maximize.png" Height="30" Width="30" />
        </Button>
        <Button Name="ExpandButtonClose" Background="#FFACD0EE"
            Click="ExpandButton1_Click" HorizontalAlignment="Right">
          <Image Source="/Images/Close_Box_Red.png" Height="30" Width="30" />
        </Button>
      </WrapPanel>
    </Expander.Header>
   <ScrollViewer MaxHeight="800">
    <ContentControl Grid.Row="1" x:Name="contentControl1"
        Content="{Binding ContentControlOne}" Margin="0,0,0,0"
        ScrollViewer.VerticalScrollBarVisibility="Auto" />
   </ScrollViewer>
  </Expander>
</Grid>

同样有五个扩展行与contentcontrol2 ..在他们每个人。

问题是,当我ContentControl中有超过父规模最大的动态内容,数据被切断并ScrollViewer中显示出来,但还是犯规显示完整的数据。 当我删除的ScrollViewer高度,并保持高度的ScrollViewer为“自动”,ScrollViewer中犯规显示在所有。

Answer 1:

尼古拉斯的答案是正确的 ,你的问题是你是如何定义网格的RowDefinition。

Auto的意思是“让孩子成长到任何他们想要的大小”,让您的ScrollViewer增长高达800像素高(因为的MaxHeight ,这是关闭屏幕)。

对于这种事情的标准解决方案是使用一个转换器中RowHeight将它设置为Auto"*" (“让孩子为占用所有剩余空间”)的基础上Expander.IsExpanded状态。

这意味着如果在扩展折叠时,它会占用它所需要的任何空间,但如果它的扩大会占用所有剩余空间(没有比这更)。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander1, Converter={x:Static MyBoolToGridSizeConverter}}" />
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander2, Converter={x:Static MyBoolToGridSizeConverter}}" />
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander3, Converter={x:Static MyBoolToGridSizeConverter}}" />
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander4, Converter={x:Static MyBoolToGridSizeConverter}}" />
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander5, Converter={x:Static MyBoolToGridSizeConverter}}" />
        <RowDefinition Height="{Binding IsExpanded, ElementName=Expander6, Converter={x:Static MyBoolToGridSizeConverter}}" />
    </Grid.RowDefinitions>

    <Expander Grid.Row="0" x:Name="Expander1">
        <ScrollViewer>
            <ContentControl x:Name="contentControl1" Content="{Binding ContentControlOne}" />
        </ScrollViewer>
    </Expander>
     ...
</Grid>

如果有多个项目被扩大,应该平分剩余的空间,因为它们都有着大小的"1*" ,这样会得到分配相等的空间量。

创建一个转换器很简单。 创建一个从继承的类IValueConverter ,实现接口,并改变Convert方法将布尔值(转换IsExpanded )为GridLength为rowHeight的值。

public class BoolToGridSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        if (value is bool && (bool)value)
            return new GridLength(1, GridUnitType.Star);

        return GridLength.Auto;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        // this is not needed
    }
}

然后再添加该转换器到你的XAML资源的实例,如

<Window.Resources>
    <local:BoolToGridSizeConverter x:Key="MyBoolToGridSizeConverter" />
</Window.Resources>

当然,另一种方法是谷歌自由WPF手风琴控制,如一个在WPF工具包 :)



Answer 2:

这里的问题是,通过设置您的所有高度Grid的行为‘自动’,你最终有一个StackPanel 。 所以没有细胞被迫比它需要,所以高度较小高度ScrollViewer是没用的。

扩展扩展行的高度必须是“*”。 把它看成是“每个扩展需要它需要的高度,除了活动一个谁需要所有剩余”。

也许类似的东西:

<Grid>
  <Expander x:Name="Expander1" ... />
  <Expander x:Name="Expander2" ... />
  <Expander x:Name="Expander3" ... />
  ...
  <Grid.RowDefinitions>
    <RowDefinition Height="{Binding IsExpanded, ElementName=Expander1, Converter={x:Static BoolToRowHeightConverter.Instance}}"/>
    <RowDefinition Height="{Binding IsExpanded, ElementName=Expander2, Converter={x:Static BoolToRowHeightConverter.Instance}}"/>
    <RowDefinition Height="{Binding IsExpanded, ElementName=Expander3, Converter={x:Static BoolToRowHeightConverter.Instance}}"/>
    ...
  </Grid.RowDefinitions>
</Grid>

BoolToRowHeightConverter返回GridLength.Star如果为true,否则GridLength.Auto



文章来源: Scrollviewer doesnt show data when its beyond parent window in wpf