我遇到了一个奇怪的问题...... 看起来使用GridSplitter调整Grid列的大小会禁用(或以其他方式停用)Grid列上定义的触发器。
这是我的设置:
网格有3列,定义如下:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition>
<ColumnDefinition.Style>
<Style>
<Setter Property="ColumnDefinition.Width" Value="Auto"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0">
<Setter Property="ColumnDefinition.Width" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ColumnDefinition.Style>
</ColumnDefinition>
<ColumnDefinition>
<ColumnDefinition.Style>
<Style>
<Setter Property="ColumnDefinition.Width" Value="4*"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0">
<Setter Property="ColumnDefinition.Width" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ColumnDefinition.Style>
</ColumnDefinition>
</Grid.ColumnDefinitions>
期望是当第三列中没有构成ItemsSource的项目时,将为第二列和第三列分配0宽度(托管GridSplitter和辅助项控件) , 分别)。
只要我不接触分离器(当辅助控制器中的所有标签都关闭时,只有第一列保持可见),这种方法效果很好。
如果我移动分离器,问题就会开始,从而有效地改变列## 0和2之间的比例。在这种情况下,当右侧控制中的所有项目都关闭时,这些列的宽度不会被重置。
我怀疑这与GridSplitter“覆盖”我在XAML中的定义有关。
有人可以确认/反驳这一理论,并建议如何解决这个问题吗?
答案 0 :(得分:18)
我对rowdefinition有同样的问题。 Gridsplitter将覆盖我们在样式或设置器中提供的任何内容。它可以使用动画解决(因为动画在依赖属性值分辨率中具有最高优先级)。对第三列做同样的事情。
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition>
<ColumnDefinition.Style>
<Style>
<Setter Property="ColumnDefinition.Width" Value="Auto" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0">
<DataTrigger.EnterActions>
<BeginStoryboard Name="BeginStoryboard1">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Width">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0"
Value="{x:Static GridLength.Auto}" />
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="BeginStoryboard1" />
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</ColumnDefinition.Style>
</ColumnDefinition>
答案 1 :(得分:2)
我想出了一个帮助程序类,它有助于解决可以使用GridSplitter调整大小的可折叠列/行的问题。
public class CollapsibleRowDefinition : RowDefinition
{
public static readonly DependencyProperty IsCollapsedProperty = DependencyProperty.Register(
"IsCollapsed",
typeof(bool),
typeof(CollapsibleRowDefinition),
new FrameworkPropertyMetadata(
false,
(s,e) => { ((CollapsibleRowDefinition) s).IsCollapsed = (bool)e.NewValue; }));
private bool isCollapsed = false;
public CollapsibleRowDefinition()
{
DependencyPropertyDescriptor.FromProperty(RowDefinition.HeightProperty, typeof(RowDefinition)).AddValueChanged(this,
(sender, args) =>
{
if (!this.IsCollapsed)
{
this.ExpandedHeight = this.Height;
}
});
}
public GridLength CollapsedHeight { get; set; }
public GridLength ExpandedHeight { get; set; }
public bool IsCollapsed
{
get { return this.isCollapsed; }
set
{
if (this.isCollapsed != value)
{
this.isCollapsed = value;
this.Height = value ? this.CollapsedHeight : this.ExpandedHeight;
}
}
}
}
然后标记就像这样
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="5"/>
<c:CollapsibleRowDefinition CollapsedHeight="20" ExpandedHeight="*" IsCollapsed="{Binding ElementName=Btn_BottomCollapse, Path=IsChecked}"/>
</Grid.RowDefinitions>
<GridSplitter Grid.Row="2" HorizontalAlignment="Stretch"
IsEnabled="{Binding ElementName=Btn_BottomCollapse, Path=IsChecked}"/>
答案 2 :(得分:0)
我遇到了同样的问题...
我能解决的唯一问题就是这样:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" x:Name="theColumn"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Expander Grid.Column="0" x:Name="theExpander" Expander.Collapsed="theExpander_Collapsed">
...
</Expander>
<GridSplitter Grid.Column="0" HorizontalAlignment="Right" Width="5">
<GridSplitter.Style>
<Style TargetType="{x:Type GridSplitter}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=theExpander, Path=IsExpanded}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</GridSplitter.Style>
</GridSplitter>
<Grid Grid.Column="1">
...
</Grid>
</Grid>
背后的代码:
private void theExpander_Collapsed(object sender, RoutedEventArgs e)
{
theColumn.Width = GridLength.Auto;
}
这不是我喜欢这样做的方式,但尝试在列定义上使用样式触发器不起作用。