web-dev-qa-db-ja.com

WPF:ListBoxItem.IsSelectedのトリガーがBackgroundプロパティで機能しない

BackgroundListBoxItemのトリガーを使用して、ItemContainerStylesのListBoxプロパティを次のように変更しようとしています。

    <ListBox Height="100" HorizontalAlignment="Left" Margin="107,59,0,0" Name="listBox1" VerticalAlignment="Top" Width="239">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Background" Value="Lightblue"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" Value="Yellow"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.Items>
            <ListBoxItem Content="First Item"/>
            <ListBoxItem Content="SecondItem"/>
            <ListBoxItem Content="Third Item"/>
        </ListBox.Items>
    </ListBox>

選択されていないアイテムの背景は水色で、ホバーされたアイテム(つまり、マウスカーソルがそれらの上にあるとき)は黄色で、選択されたアイテムは赤であると予想されます。

選択されていないアイテムとホバーされたアイテムの場合、これは期待どおりに機能しますが、選択されたアイテムの背景色は標準のままです(つまり、リストボックスにフォーカスがある場合は青、それ以外の場合はライトグレー)。

足りないものはありますか?この動作はどこかに文書化されていますか?

ヒントをありがとう!

[〜#〜]編集[〜#〜]

デフォルトのシステムカラーをオーバーライドするソリューションを知っています( 選択されたフォーカスのないリストボックススタイルをグレー表示されないように変更 、とにかくこれを回答として投稿してくれたすべての人に感謝します)。しかし、これは私がやりたいことではありません。私のソリューションが機能しない理由にもっと興味があります。

ControlTemplateの標準ListItemが、スタイルによって定義されたトリガーよりも優先されるように見える独自のトリガーを定義しているのではないかと疑っています(おそらく誰かがこれを確認して、この動作が行われるリソースを教えてくれます)定義されています)。

当面の私の解決策は、次のようにControlTemplatesに対してListItemを定義することです。

        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="LightBlue" Margin="0">
                                <ContentPresenter/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter TargetName="Border" Property="Background" Value="Red"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
18
MartinStettner

Aeroスタイルについて少し考えてみると、この単純なトリガー設定が機能しない理由がわかります。

ListBoxItemには、トリガーよりも優先されるトリガーを持つControlTemplateがあります。少なくとも、これはMultiTriggerには当てはまるようです。 Selected = trueの単純なトリガーをオーバーライドすることができましたが、マルチトリガーの場合は、独自のControlTemplateを作成する必要がありました。

これは、問題のあるMultiTriggerを示すAeroスタイルのテンプレートです。

<ControlTemplate TargetType="{x:Type ListBoxItem}">
    <ControlTemplate.Triggers>
        <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Bd" Value="{DynamicResource {x:Static HighlightBrush}}" Property="Background" />
            <Setter Value="{DynamicResource {x:Static HighlightTextBrush}}" Property="Foreground" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="true" />
                <Condition Property="IsSelectionActive" Value="false" />
            </MultiTrigger.Conditions>
            <Setter TargetName="Bd" Value="{DynamicResource {x:Static ControlBrush}}" Property="Background" />
            <Setter Value="{DynamicResource {x:Static ControlTextBrush}}" Property="Foreground" />
        </MultiTrigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Value="{DynamicResource {x:Static GrayTextBrush}}" Property="Foreground" />
        </Trigger>
    </ControlTemplate.Triggers>
    <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
    </Border>
</ControlTemplate>

それが物事を少しクリアすることを願っています。なぜ彼らがスタイルをこれほど複雑にしすぎたのか理解できません。

14
Almund

isSelectedトリガーを削除し、リストボックスに追加します。

<ListBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                         Color="Red" />
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                         Color="Red" />
</ListBox.Resources>

焦点を合わせた最初のブラシそれ以外の場合は2番目

7
Sonorx

これをウィンドウリソースに追加してみてください-

 <Window.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Red" />
 </Window.Resources>

また、コードからIsSelectedトリガーを削除します。システムのテーマに応じて、すべてのシステムにデフォルトのハイライトブラシがあるため、機能しません。

それを機能させるには、コードのハイライトブラシをオーバーライドする必要があります。

3
Rohit Vats

IsSelectedではなくSelector.IsSelectedをトリガーで使用してみてください。

0
Andrej