web-dev-qa-db-ja.com

選択したリストボックスアイテムの背景色を変更する

これはこれまでの私のXAMLです。

    <ScrollViewer Grid.Column="1" Grid.RowSpan="2">

        <ListBox   Background="Black" ItemsSource="{Binding Path=ActiveLog}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Black">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White">
                            <TextBlock >Date:</TextBlock>
                            <TextBlock  Text="{Binding Path=LogDate}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="1" Grid.Row="0" Foreground="White">
                            <TextBlock >Severity:</TextBlock>
                            <TextBlock  Text="{Binding Path=Severity}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Foreground="LightGray" Text="{Binding Path=Message}"></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.Template>
                <ControlTemplate>
                    <StackPanel Background="Black" IsItemsHost="True" >
                    </StackPanel>
                </ControlTemplate>
            </ListBox.Template>

        </ListBox>
    </ScrollViewer>

唯一の問題は、選択したアイテムの右側に青いボックスがあることです。選択色を変更する方法があると思いますが、見つけられません。

60
Jonathan Allen

ListBox.ItemContainerStyle を使用する必要があります。

ListBox.ItemTemplateは、アイテムのcontentの表示方法を指定します。ただし、WPFは引き続き各アイテムをListBoxItemコントロールにラップします。これは、デフォルトで、選択されている場合、システムのハイライトカラーに設定された背景を取得します。 WPFによるListBoxItemコントロールの作成を停止することはできませんが、スタイルを設定して(場合によっては、背景を常に透明または黒などに設定して)、そうするにはItemContainerStyleを使用します。

juFoの答え は、アイテムスタイルのコンテキスト内でシステムバックグラウンドブラシリソースを「ハイジャック」することにより、1つの可能な実装を示しています。別の、おそらくより慣用的な手法は、BackgroundプロパティにSetterを使用することです。

46
itowlson
<UserControl.Resources>
    <Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Transparent"/>
        </Style.Resources>
    </Style>
</UserControl.Resources> 

そして

<ListBox ItemsSource="{Binding Path=FirstNames}"
         ItemContainerStyle="{StaticResource myLBStyle}">  

Listboxitemのスタイルをオーバーライドするだけです(「TargetType is ListBoxItem」を参照)

73
juFo

または、ListBoxにHi​​ghlightBrushKeyを直接適用できます。 Setter Property = "Background" Value = "Transparent"は機能しませんでした。しかし、フォアグラウンドを黒に設定する必要がありました。

    <ListBox  ... >
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True" >
                        <Setter Property="FontWeight" Value="Bold" />
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </Style.Triggers>
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
                </Style.Resources>
            </Style>                
        </ListBox.ItemContainerStyle>
51
paparazzo

HighlightBrushKeyとControlBrushKeyの両方を設定して、スタイルを正しく設定する必要がありました。そうでない場合、フォーカスがある間、これは透明なHighlightBrusKeyを正しく使用します。 Bt、コントロールがフォーカスを失った場合(まだ強調表示されている間に)、ControlBrushKeyを使用します。

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

.Net 4.5以降を使用する場合は、InactiveSelectionHighlightBrushKeyの代わりにControlBrushKeyを使用します。

<Style.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" />
</Style.Resources>

これが誰かの助けになることを願っています。

30
RichS

このようなアイテム選択用の新しいテンプレートを作成する必要があります。

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ListBoxItem">
            <Border
                BorderThickness="{TemplateBinding Border.BorderThickness}"
                Padding="{TemplateBinding Control.Padding}"
                BorderBrush="{TemplateBinding Border.BorderBrush}"
                Background="{TemplateBinding Panel.Background}"
                SnapsToDevicePixels="True">
                <ContentPresenter
                    Content="{TemplateBinding ContentControl.Content}"
                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
8
Duncan

選択が重要でない場合は、ScrollViewerにラップされたItemsControlを使用することをお勧めします。この組み合わせは、Listbox(実際にItemsControlから既に派生している)よりも軽量であり、これを使用すると、ItemsControlにすでに存在しない動作をオーバーライドするために安価なハックを使用する必要がなくなります。

選択動作ISが実際に重要である場合、これは明らかに機能しません。ただし、選択された項目の背景の色を表示されないように変更したい場合はアイテムが選択されていることを示すために他の特性を変更したい場合は、この質問に対する他の回答のいくつかがさらに関連している可能性があります。

マークアップの外観のスケルトンは次のとおりです。

    <ScrollViewer>
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    ...
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
8
user3308241