我在DockPanel中有一个ListView。我需要将ListView水平拉伸并在DockPanel内垂直居中。当ListView被禁用(IsEnabled = false)时,我需要更改DockPanel的背景以匹配禁用的ListView的背景颜色。
所以,基本上我想避免下图所示的情况。
<Window>
<DockPanel IsEnabled="False">
<ListView IsEnabled="False" VerticalAlignment="Center" HorizontalContentAlignment="Center">
<ListViewItem Content="AAA"/>
<ListViewItem Content="BBB"/>
<ListViewItem Content="CCC"/>
</ListView>
</DockPanel>
</Window>
但是,我不想在我的代码中的任何地方显式声明颜色,因为我不知道ListView在不同的Windows环境中使用什么样的背景颜色(我不确定,但我猜不同的Windows主题/颜色设置可以改变ListView的默认背景颜色 - 这可能与我不想明确声明的颜色不同。
将ListView的背景颜色绑定到DockPanel的背景颜色不起作用。
所以,现在我正在使用以下解决方法。
<DockPanel.Style>
<Style TargetType="{x:Type DockPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=parametersListView, Path=IsEnabled}" Value="False">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DockPanel.Style>
我已经在其ControlTemplate中提取了我的ListView使用的资源键。在模板上,在IsEnabled属性上声明了一个Trigger,它将控件的背景颜色设置为SystemColors.ControlBrushKey键所代表的颜色。
这似乎有效,但我不确定这是否是正确的方法。
有没有办法以更强大的健壮的方式做到这一点,或者这是我能做的最好的?
(旁注:使用SystemColors.ControlBrush代替SystemColors.ControlBrushKey会产生不同的灰色阴影,我不知道为什么。)
答案 0 :(得分:0)
为什么不使用LstFilledChild = true
编辑: 如果您为元素命名并在绑定中使用ElementName,它应该可以工作。
<DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{Binding Background, ElementName=myList}">
<ListView Name="myList" IsEnabled="False" HorizontalAlignment="Center" HorizontalContentAlignment="Center" >
<ListViewItem>AAA</ListViewItem>
</ListView>
</DockPanel>
答案 1 :(得分:0)
因为我问过我的问题,我正在处理的应用程序是 live ,并且它正在使用我最初提出的解决方案,如下所示。它暂时运作良好。
<Window>
<DockPanel IsEnabled="False">
<DockPanel.Style>
<Style TargetType="{x:Type DockPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=myListView, Path=IsEnabled}"
Value="False">
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DockPanel.Style>
<ListView IsEnabled="False"
VerticalAlignment="Center"
HorizontalContentAlignment="Center"
x:Name="myListView"
x:FieldModifier="private">
<ListViewItem Content="AAA"/>
<ListViewItem Content="BBB"/>
<ListViewItem Content="CCC"/>
</ListView>
</DockPanel>
</Window>