网格列和行长度上的 WPF 转换器仅在不使用 gridsplitter 时才有效
WPF converter on grid column and row length only works if gridsplitter is not used
在 WPF 中,我有一个布尔值到长度的转换器,我已将其绑定到列和行定义。
此转换器用于读取绑定的布尔值以确定 row/column 应该隐藏还是显示。
这样我就可以 "maximize" 网格的给定部分或 return 恢复到原来的大小。只要我不使用 gridsplitter 来调整大小,这就有效。一旦发生这种情况,它就不再设置所需的长度。我有一种感觉,一旦使用 gridsplitter,它就会删除对列定义的绑定。有解决办法吗?
转换器
[ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridLengthConverter : IValueConverter
{
public int Length { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? new GridLength(Length == 0 ? 1 : Length, GridUnitType.Star) : new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
XAML
<Grid>
<Grid.Resources>
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter1" Length="1" />
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter2" Length="2" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ShowColumn1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="{Binding ShowColumn2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="{Binding ShowColumn3, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding ShowRow1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<RowDefinition Height="5" />
<RowDefinition Height="{Binding ShowRow2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter2}}" />
</Grid.RowDefinitions>
<Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
<GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
<Grid Grid.Column="0" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="2" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>
编辑:重组问题以包含更多内容XAML
编辑:附加信息,当我希望扩展网格部分时,我将所有布尔值设置为 false,并将我想要的部分设置为 true。例如,如果我希望最大化 Grid.Column 2 和 Grid.Row 2,我将除 ShowColumn2 和 ShowRow2 之外的所有布尔值设置为 false。这按预期工作,当布尔值全部设置为 true 时,为了取回原始视图,它也按预期工作。问题是,一旦我使用 gridsplitter 调整列的大小,它就无法像以前那样工作了。当我最大化与之前相同的部分时,它工作正常,但是当我尝试将大小时调整回原始大小时,Grid.Column 2 和 Grid.Row 2 占据了整个底行。旁边的两列被最小化了。
这让我相信,当使用 gridsplitter 时,转换器将不再能够将列的值设置为 true。
在您的 ColumnDefinition
中,您需要将 MaxWidth
设置为零以隐藏 Column
和 MaxHeight
为零 Row
.
尝试以下转换器:
[ValueConversion(typeof(bool), typeof(double))]
public class BoolToMaxConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? double.MaxValue : 0d;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
和你的 xaml:
<Grid>
<Grid.Resources>
<local:BoolToMaxConverter x:Key="BoolToMaxConverter" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="{Binding ShowColumn1, Converter={StaticResource BoolToMaxConverter}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition MaxWidth="{Binding ShowColumn2, Converter={StaticResource BoolToMaxConverter}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition MaxWidth="{Binding ShowColumn3, Converter={StaticResource BoolToMaxConverter}}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MaxHeight="{Binding ShowRow1, Converter={StaticResource BoolToMaxConverter}}" />
<RowDefinition Height="5" />
<RowDefinition MaxHeight="{Binding ShowRow2, Converter={StaticResource BoolToMaxConverter}}" />
</Grid.RowDefinitions>
<Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
<GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
<Grid Grid.Column="0" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="2" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>
同时考虑删除 TwoWay-Binding
。
在 WPF 中,我有一个布尔值到长度的转换器,我已将其绑定到列和行定义。
此转换器用于读取绑定的布尔值以确定 row/column 应该隐藏还是显示。
这样我就可以 "maximize" 网格的给定部分或 return 恢复到原来的大小。只要我不使用 gridsplitter 来调整大小,这就有效。一旦发生这种情况,它就不再设置所需的长度。我有一种感觉,一旦使用 gridsplitter,它就会删除对列定义的绑定。有解决办法吗?
转换器
[ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridLengthConverter : IValueConverter
{
public int Length { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? new GridLength(Length == 0 ? 1 : Length, GridUnitType.Star) : new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
XAML
<Grid>
<Grid.Resources>
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter1" Length="1" />
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter2" Length="2" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ShowColumn1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="{Binding ShowColumn2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="{Binding ShowColumn3, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding ShowRow1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
<RowDefinition Height="5" />
<RowDefinition Height="{Binding ShowRow2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter2}}" />
</Grid.RowDefinitions>
<Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
<GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
<Grid Grid.Column="0" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="2" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>
编辑:重组问题以包含更多内容XAML
编辑:附加信息,当我希望扩展网格部分时,我将所有布尔值设置为 false,并将我想要的部分设置为 true。例如,如果我希望最大化 Grid.Column 2 和 Grid.Row 2,我将除 ShowColumn2 和 ShowRow2 之外的所有布尔值设置为 false。这按预期工作,当布尔值全部设置为 true 时,为了取回原始视图,它也按预期工作。问题是,一旦我使用 gridsplitter 调整列的大小,它就无法像以前那样工作了。当我最大化与之前相同的部分时,它工作正常,但是当我尝试将大小时调整回原始大小时,Grid.Column 2 和 Grid.Row 2 占据了整个底行。旁边的两列被最小化了。
这让我相信,当使用 gridsplitter 时,转换器将不再能够将列的值设置为 true。
在您的 ColumnDefinition
中,您需要将 MaxWidth
设置为零以隐藏 Column
和 MaxHeight
为零 Row
.
尝试以下转换器:
[ValueConversion(typeof(bool), typeof(double))]
public class BoolToMaxConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? double.MaxValue : 0d;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
和你的 xaml:
<Grid>
<Grid.Resources>
<local:BoolToMaxConverter x:Key="BoolToMaxConverter" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="{Binding ShowColumn1, Converter={StaticResource BoolToMaxConverter}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition MaxWidth="{Binding ShowColumn2, Converter={StaticResource BoolToMaxConverter}}" />
<ColumnDefinition Width="5" />
<ColumnDefinition MaxWidth="{Binding ShowColumn3, Converter={StaticResource BoolToMaxConverter}}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MaxHeight="{Binding ShowRow1, Converter={StaticResource BoolToMaxConverter}}" />
<RowDefinition Height="5" />
<RowDefinition MaxHeight="{Binding ShowRow2, Converter={StaticResource BoolToMaxConverter}}" />
</Grid.RowDefinitions>
<Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
<GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
<Grid Grid.Column="0" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="2" Grid.Row="2"></Grid>
<GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
<Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>
同时考虑删除 TwoWay-Binding
。