【发布时间】:2017-05-06 02:39:38
【问题描述】:
我在 UserControl 中有 DataGrid。 Datagrid 绑定到具有 50 个项目(50 行)的 ItemsSource。 UserControl 宽度和高度设置为自动。如何在不指定 DataGrid 的高度和宽度的情况下启用 ScrollBar?也许我错过了一些东西,因为此时设计师告诉我我的 DataGrid Height 是 5000(基于自动计算),这就是 ScrollBar 没有显示的原因。我希望我的 DataGrid 适合主窗口容器 - 带有星号的网格行。 我不想使用固定尺寸,因为我想在不同的屏幕分辨率上使用这个视图。
<UserControl x:Class="Treasury7MD.Views.Form7MDTableHeadeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="1" Style="{StaticResource FormGridBorderStyle}" Margin="20,0,0,20" >
<Grid.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>
</Grid.Resources>
<DataGrid x:Name="dg" ItemsSource="{Binding KEKVs}" CanUserAddRows="False" AutoGenerateColumns="False" RowHeaderWidth="0" SelectionUnit="Cell" HorizontalContentAlignment="Stretch" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTemplateColumn Header="1">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Width="{Binding ActualWidth, ElementName=IndicatorTbl}" Text="{Binding Indicator, Mode=TwoWay}" TextWrapping="Wrap"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="2">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Width="{Binding ActualWidth, ElementName=KEKVTbl}" Text="{Binding Name, Mode=TwoWay}" TextWrapping="WrapWithOverflow"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="3">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Width="{Binding ActualWidth, ElementName=RowCodeTbl}" Text="{Binding RowCode, Mode=TwoWay}" TextWrapping="WrapWithOverflow"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="4">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<customControlls:NumericTextBox Style="{StaticResource NumericTextboxStyle}" Width="{Binding ActualWidth, ElementName=AccRecAtTheBeginingTbl}" Text="{Binding AccountsReceivable.AtTheBeginingOfTheYear, UpdateSourceTrigger=LostFocus}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="5">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<customControlls:NumericTextBox Style="{StaticResource NumericTextboxStyle}" Width="{Binding ActualWidth, ElementName=AccRecAtTheEndTbl}" Text="{Binding AccountsReceivable.AtTheEndOfTheReportingPeriod, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="6">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<customControlls:NumericTextBox Style="{StaticResource NumericTextboxStyle}" Width="{Binding ActualWidth, ElementName=AccRecOverdueTbl}" Text="{Binding AccountsReceivable.OverdueAtTheEndOfTheReportingPeriod, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="6">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<customControlls:NumericTextBox Style="{StaticResource NumericTextboxStyle}" Width="{Binding ActualWidth, ElementName=AccRecWrittenOffTbl}" Text="{Binding AccountsReceivable.WrittenOffSinceTheBeginningOfTheYear, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
这是 UserControl 所在的 View
<Window x:Class="Treasury7MD.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" WindowState="Maximized">
<Grid>
<Grid Name="g" >
<Grid.RowDefinitions>
<RowDefinition MaxHeight="20"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Name="x" Height="*" MinHeight="100"></RowDefinition>
</Grid.RowDefinitions>
<Button Content="Collapse" Click="Button_Click"></Button>
<views:OrganizationInfoView x:Name="z" Grid.Row="1"></views:OrganizationInfoView>
<ScrollViewer Grid.Row="2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" >
<views:Form7MDTableHeadeView Grid.Row="2" ></views:Form7MDTableHeadeView>
</ScrollViewer>
</Grid>
</Grid>
【问题讨论】:
-
作为简单的解决方案,您可以将数据网格放在滚动查看器中
-
这听起来像是 DOM 中更高层的布局问题。当您说您在 * 高度的 Grid 中拥有 DataGrid 时,该父 Grid 是否偶然是 StackPanel 的子级?您不需要定义固定大小,但听起来您的布局没有提供调用 DataGrid 模板中内置的嵌入式滚动查看器所需的边界。
-
ScrollViewer 给出相同的结果。
-
Chris W,不,它不是 StackPanek 的孩子。
-
尝试给 Datagrid 一些 MaxHeight
标签: c# wpf xaml datagrid scrollbar