XAML:如何将数据网格限制为其父级宽度

时间:2012-02-02 21:37:53

标签: xaml

我有一个[silverlight] WizardContainer控件,它托管了许多向导页面。该向导非常适合其主机表单。如果页面内容较窄,则不会展开以填充容器。所以我将HorizontalContentAlignment设置为Stretch。这有效。

但是,如果向导页面包含一个包含大量列的数据网格,它会拉伸页面而不是自动滚动自身 - 因为它的宽度不固定。如果以下XAML位于宽度为350的usercontrol上,我希望网格为350并拥有自己的滚动条。如果WizardContainer小于页面minwidth,那么MainScroller应该起作用。

<Grid x:Name="LayoutRoot" >
<ScrollViewer x:Name="MainScroller" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" >
<ContentControl Margin="4"  x:Name="WizardContainer"  HorizontalContentAlignment="Stretch">
<Grid Background="Red" x:Name="WizardPage" MinWidth="300">
<sdk:DataGrid HorizontalAlignment="Left" Height="120" >
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn  Width="150"/>
<sdk:DataGridTextColumn  Width="150"/>
<sdk:DataGridTextColumn  Width="150"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>         
</ContentControl>
</ScrollViewer>
</Grid>

请注意,如果我修复了数据网格的宽度,则此XAML中的所有内容都可以正常工作。但是当用户调整包含向导容器的表单时,我希望网格扩展。

1 个答案:

答案 0 :(得分:1)

您将DataGrid包装在ScrollViewer中。这实际上告诉DataGrid它具有无限的可用宽度。由于DataGrid没有受到约束,因此它需要的宽度与列所需的宽度相同。

如果符合您的设计,您可以设置HorizontalScrollBarVisibility="Disabled"(即您只需要从ScrollViewer垂直滚动)。这将禁用水平滚动,并将DataGrid限制在水平轴上。

DataGrid在其ControlTmplate中有一个ScrollViewer。作为一个广泛的一般规则:尝试避免ScrollViewer-in-a-ScrollViewer情况。它(几乎)总是很难调试,最终你必须将某些东西设置为固定大小(或者动态计算大小)。