0

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>

ただし、コード内のどこでも色を明示的に宣言したくありません。なぜなら、異なる Windows 環境で ListView がどのような背景色を使用するのかがわからないからです (よくわかりませんが、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>

ListView がその ControlTemplate で使用しているリソース キーを抽出しました。テンプレートには、IsEnabled プロパティで宣言された Trigger があり、コントロールの背景色を SystemColors.ControlBrushKey キーで表される色に設定します。

これは機能しているようですが、これが正しい方法であるかどうかはわかりません。

これをより堅牢な方法で行う方法はありますか、それともこれが最善の方法ですか?

(補足: SystemColors.ControlBrushKey の代わりに SystemColors.ControlBrush を使用すると、別のグレーの色合いが生成されますが、その理由はわかりません。)

4

2 に答える 2

0

私が質問したので、私が取り組んでいたアプリケーションはライブであり、最初に思いついた次のソリューションを使用しています。今のところうまく機能しています。

<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>
于 2013-04-04T04:22:02.127 に答える
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>
于 2013-03-22T12:27:24.967 に答える