Mar*_*son 13 wpf user-interface xaml datagrid
我有一个需要响应的WPF应用程序.我想要的是一个DataGrid内部Grid.当窗口缩小时,我希望Grid先调整大小,然后再调整大小DataGrid.这是我到目前为止所取得的成就:
在顶部的gif中,您可以看到Grid首先调整大小,当它达到最小缩放大小时,它会越过底部DataGrid.不完全是我想要的,因为我想首先缩放布局,然后在布局中显示滚动条DataGrid而不是布局.所以我尝试了以下方法:
在这里你可以看到它显示我想要的滚动条.唯一的事情是它首先调整DataGrid的大小,当它完成DataGrid的大小调整后,它开始调整Grid的大小.我希望它是另一种方式,首先调整网格大小,然后调整DataGrid的大小并显示Scrollbars.所以基本上我正在寻找一个解决方案来执行以下操作:
因此,这个问题归结为第一个Gif,然后是DataGrid中的滚动条
有没有办法做到这一点?看起来我很亲密,因为它是这两件事的组合,但我不知道如何.这是我的代码:
<Grid Grid.Row="1" HorizontalAlignment="Right" Grid.Column="0">
<Grid ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="20"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Name="DataGridRow" Height="*" MaxHeight="240" />
</Grid.RowDefinitions>
<Label Grid.Row="1" FontSize="24">Test</Label>
<Label Grid.Row="3" Content="Test"/>
<ComboBox Grid.Row="5" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" />
<Label Grid.Row="7" Content="Test"/>
<ComboBox Grid.Row="9" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left"/>
<Separator Grid.Row="11"/>
<Label Grid.Row="13" Content="Test" />
<Grid Grid.Row="15">
<DataGrid
RowHeight="40"
CanUserAddRows="False"
x:Name="dataGrid"
AutoGenerateColumns="False"
CanUserResizeColumns="True"
HeadersVisibility="None"
GridLinesVisibility="None"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Width="*" Binding="{Binding Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,0,0"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
在使用默认构建块无法再解决布局方程的情况下,您可以自己进行计算.让转换器计算剩余的可用空间.
剩下的问题有两个:
在DataGrid当明星级行有可能只缩小
ActualHeight0.
解决方案:DataGrid.Style其设定dataGrid.MaxHeight时
triggerGrid.ActualHeight= 0(triggerGrid占据星形尺寸行).
当我们给它一个时MinHeight,DataGridRow它会在缩小时dataGrid.ActualHeight收缩(它会缩回收缩高度).
解决方案:RowDefinition.Style将其设置MinHeight为
dataGrid.ActualHeightwhen triggerGrid.ActualHeight= 0,否则设置为固定值.
我设置了控件的BackGround颜色,以说明星形大小(剩余空白)变为0的时间.
<Window
...
Width="200" Height="450">
<Window.Resources>
<local:HeightConverter x:Key="HeightConverter" />
<local:IsEqualToZeroConverter x:Key="IsEqualToZeroConverter" />
</Window.Resources>
<!--MainGrid-->
<Grid x:Name="mainGrid">
<Grid ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="20"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="50"/>
<RowDefinition Height="auto"/>
<RowDefinition MaxHeight="5"/>
<RowDefinition x:Name="dataGridRow" Height="Auto">
<RowDefinition.Style>
<Style TargetType="{x:Type RowDefinition}">
<Style.Triggers>
<DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid, Converter={StaticResource IsEqualToZeroConverter}}" Value="True">
<Setter Property="MinHeight" Value="{Binding ActualHeight, ElementName=dataGrid}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid, Converter={StaticResource IsEqualToZeroConverter}}" Value="False">
<Setter Property="MinHeight" Value="80.0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
</Grid.RowDefinitions>
<Label x:Name="bigLabel" Grid.Row="1" FontSize="24" Background="LightGray">Test</Label>
<Label x:Name="regularLabel" Grid.Row="3" Content="Test" Background="LightGray"/>
<ComboBox x:Name="comboBox" Grid.Row="5" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" Background="LightGray" />
<Label Grid.Row="7" Content="Test" Background="LightGray"/>
<ComboBox Grid.Row="9" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" Background="LightGray"/>
<Separator x:Name="separator" Grid.Row="11"/>
<Label Grid.Row="13" Content="Test" Background="LightGray"/>
<!--TriggerGrid-->
<Grid Grid.Row="14" x:Name="triggerGrid"/>
<Grid Grid.Row="15">
<DataGrid
x:Name="dataGrid"
RowHeight="40"
CanUserAddRows="False"
AutoGenerateColumns="False"
CanUserResizeColumns="True"
HeadersVisibility="None"
GridLinesVisibility="None"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Auto">
<DataGrid.Style>
<Style TargetType="{x:Type DataGrid}">
<Style.Triggers>
<DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid}" Value="0">
<Setter Property="MaxHeight">
<Setter.Value>
<MultiBinding Converter="{StaticResource HeightConverter}">
<Binding ElementName="mainGrid" Path="ActualHeight"/>
<Binding ElementName="bigLabel" Path="ActualHeight"/>
<Binding ElementName="regularLabel" Path="ActualHeight"/>
<Binding ElementName="comboBox" Path="ActualHeight"/>
<Binding ElementName="separator" Path="ActualHeight"/>
</MultiBinding>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Width="*" Binding="{Binding Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,0,0"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
转换器
public class HeightConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
// only 1 check at startup (Debugging)
if ((double)values[1] == 0.0) return 0.0;
double mainGridHeight = (double)values[0];
double bigLabelHeight = (double)values[1];
double regularLabelHeight = (double)values[2];
double comboBoxHeight = (double)values[3];
double separatorHeight = (double)values[4];
double dataGridHeight = mainGridHeight - bigLabelHeight - 2 * (regularLabelHeight + comboBoxHeight) - regularLabelHeight - separatorHeight;
if (dataGridHeight > 0.0) return dataGridHeight; else return 0.0;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class IsEqualToZeroConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((double)value == 0.0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |