Ale*_*lex 11 wpf grid gridsplitter
我遇到了一个奇怪的问题......
看起来使用GridSplitter调整Grid列的大小会禁用(或以其他方式停用)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>
Run Code Online (Sandbox Code Playgroud)
期望的是,当第三列中没有构成用于控件的ItemsSource的项时,将为第二列和第三列分配0宽度(分别托管GridSplitter和辅助项控件).
只要我不接触Splitter(当辅助控件中的所有选项卡都关闭时,只有第一列仍然可见),这种方法效果很好.
如果我移动分离器,问题就会开始,从而有效地改变列## 0和2之间的比例.在这种情况下,当右侧控制中的所有项目都关闭时,这些列的宽度不会被重置.
我怀疑这与GridSplitter"覆盖"我在XAML中的定义有关.
有人可以确认/反驳这一理论,并建议如何解决这个问题?
小智 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>
Run Code Online (Sandbox Code Playgroud)
小智 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>
Run Code Online (Sandbox Code Playgroud)
以及背后的代码:
private void theExpander_Collapsed(object sender, RoutedEventArgs e)
{
theColumn.Width = GridLength.Auto;
}
Run Code Online (Sandbox Code Playgroud)
这不是我喜欢的方式,但尝试在列定义上使用样式触发器是行不通的。