Wpf GridSplitter覆盖ColumnDefinition';s型触发器?
我遇到了一个奇怪的问题…Wpf GridSplitter覆盖ColumnDefinition';s型触发器?,wpf,grid,gridsplitter,Wpf,Grid,Gridsplitter,我遇到了一个奇怪的问题… 看起来,使用GridSplitter调整网格列的大小会禁用(或停用)网格列上定义的触发器 以下是我的设置: 网格有3列,定义如下: <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition> <ColumnDefinition.Style> <Style>
看起来,使用GridSplitter调整网格列的大小会禁用(或停用)网格列上定义的触发器 以下是我的设置: 网格有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中的定义有关
有人能证实/反驳这个理论,并建议如何解决这个问题吗?我也有同样的问题 我唯一能做的就是这样:
<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>
这不是我喜欢的方式,但尝试在列定义上使用样式触发器是行不通的。我在rowdefinition上也遇到了同样的问题。Gridsplitter将覆盖我们在样式或setter中提供的任何内容。可以使用动画解决此问题(因为动画在依赖项属性值解析中具有最高优先级)。对第三列执行相同的操作
<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>
我提出了一个帮助器类,帮助解决可折叠列/行的问题,这些列/行也可以通过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}"/>
惊人的解决方案。我花了两天的时间来解决一个类似的问题,使用这个解决方案,我花了一个小时来调整我的xaml,只有行。非常感谢你!优秀的解决方案。。。对我有用。这是我的解决方案版本,包括ColumnDefinition的实现。注意,我颠倒了布尔逻辑(IsExpanded而不是IsCollapsed)。
<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}"/>