2014-09-18 88 views
0

我想创建一个UserControl,可以使用像一个frozingDatagrid行(因为没有一个默认情况下)。我的用户是基本的:WPF - 第一个数据网格的两个,最大高度

<UserControl ..> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto" /> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Datagrid Name="Frozen" Grid.Row="0" MaxHeight="{Binding Height, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type UserControl}}}" ... /> 
     <Datagrid Name="Normal" Grid.Row="1" ... /> 
    </Grid> 

我想滚动选项仅适用于普通的DataGrid,但如果冻结DataGrid的高度超过用户控件的高度。现在,冻结数据网格为他包含的所有项目支出。

编辑:

我能够得到你的例子的结果。

但是,当我调整我的窗口较小,如果冻结的部分被剪切,并没有滚动条出现。我认为把MaxHeight属性放在一个好的位置,但是它的样式在屏幕上生成控件之前应用,所以UserControl没有高度。所以它的MaxHeight到NaN和我的数据网格比我的控制更长,所以我错过了数据。

感谢

+0

Sory想要添加图片来帮助,但我没有足够的代表.... =( – Northik 2014-09-18 16:58:05

+0

您仍然可以将图片上传到某个图片主持人,并在您的问题中添加一个链接。 – qqbenq 2014-09-19 09:49:28

回答

0

我觉得你这样的事情后(但随着DataGrids,而不是简单TextBlocks - 我currenty只能访问Kaxaml,但其基本思想是一样的):

frozen vs normal

下面是该XAML(不完整的Lorem存有部分):

<Grid x:Name="grid" Height="400" Width="350"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto" /> 
      <RowDefinition x:Name="normalRow" Height="*"/> 
     </Grid.RowDefinitions> 

     <TextBlock x:Name="Frozen" Grid.Row="0" 
        MaxHeight="{Binding Path=Height, ElementName=grid}" 
        Background="LightBlue" TextWrapping="Wrap" Padding="5"> 
      Lorem ipsum dolor... 
     </TextBlock> 

     <ScrollViewer x:Name="Normal" Grid.Row="1" 
        MaxHeight="{Binding Path=Height, ElementName=normalRow}" > 
      <TextBlock Margin="5" TextWrapping="Wrap"> 
       Lorem ipsum dolor... 
      </TextBlock> 
     </ScrollViewer> 
</Grid> 

主要想法是命名RowDefinition,并将“正常”部分的Height与其Height属性绑定,同时将第一行的MaxHeight绑定到GridHeight

一个共同的“绝招”我经常使用:命名UserControl(例如:x:Name="Instance"),您可以轻松地绑定到这种方式的属性,在这种情况下,Width和最Grid控制Height


更新:

,如果大小控制到一个足够小的尺寸的第一行的内容被削减可以通过引入MaxHeightRowDefinition,并绑定固定的问题到Grid本身的Height,但不幸的是它似乎设置RowDefinitionHeigthAuto使其忽略任何MaxHeight设置(见本question)...

但这里是一个解决办法:

<UserControl x:Name="instance"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition x:Name="normalRow" Height="*"/> 
     </Grid.RowDefinitions> 

     <ScrollViewer x:Name="Frozen" Grid.Row="0" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" 
        MaxHeight="{Binding ElementName=instance, Path=Height}"> 
      <TextBlock x:Name="test" Background="LightBlue" TextWrapping="Wrap" Padding="5" > 
       Lorem ipsum dolor ... 
      </TextBlock> 
     </ScrollViewer> 

     <ScrollViewer x:Name="Normal" Grid.Row="1" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" 
        MaxHeight="{Binding Path=Height, ElementName=normalRow}" > 
      <TextBlock Margin="5" TextWrapping="Wrap"> 
       Lorem ipsum dolor ... 
      </TextBlock> 
     </ScrollViewer> 
    </Grid> 
</UserControl> 

关键是要结合第一列的内容的MaxHeightUserControl的高度。

当然在你的情况下ScrollViewers并不是真的需要,因为DataGrid有内置滚动条,但我希望你明白了。

相关问题