更改DockPanel背景以匹配禁用的ListView背景颜色

时间:2013-03-22 12:23:00

标签: wpf xaml listview wpf-controls

我在DockPanel中有一个ListView。我需要将ListView水平拉伸并在DockPanel内垂直居中。当ListView被禁用(IsEnabled = false)时,我需要更改DockPanel的背景以匹配禁用的ListView的背景颜色。

所以,基本上我想避免下图所示的情况。

enter image description here

<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会产生不同的灰色阴影,我不知道为什么。)

2 个答案:

答案 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>