web-dev-qa-db-ja.com

リストボックスの強調表示を無効にして選択を維持する方法は?

ListBoxが選択された項目を強調表示しないようにする方法を見つけるのに問題があります。アイテムを強調表示するトリガーを追加しなかったことを知っています。

<ListBox Name="CartItems" ItemsSource="{Binding}"
         ItemTemplate="{StaticResource TicketTemplate}" 
         Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent"
         BorderBrush="Transparent">
</ListBox>
33
Aero Chocolate

遅い答えですが、はるかに優れたシンプルなソリューションがあります:

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

これにより、アイテムコントロールのように見えるLisBoxを使用できますが、選択はサポートされています。

編集:How仕組み
これは、このListBoxとその子のみに対して「システムの色」、つまりあなたのWindowsテーマを変更します(実際にListboxItemをターゲットにしたい)。

たとえば、ListboxItemをホバリングすると、通常は深い青色の背景になりますが、ここでは透明(HighlightBrushKey)に設定します。

編集(2016年6月30日):
Windowsの最新バージョンでは、これではもう十分ではないようです。InactiveSelectionHighlightBrushKeyを再定義する必要もあります

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

コメントの@packomanに感謝

45
Louis Kottmann
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
56
Wayne Lo

強調表示を完全に削除することは非常に奇妙に感じます。何かを選択したかどうかはわかりませんが、ここではWhiteSmokeの代わりにBlue(非常に微妙です)を使用するコントロールテンプレートのバージョンがあります

<Window.Resources>
    <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, 
            RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment,
             RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="2,0,0,0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 
                            Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="WhiteSmoke"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <ListBox HorizontalAlignment="Left" VerticalAlignment="Top" ItemContainerStyle="{DynamicResource ListBoxItemStyle1}">
        <ListBoxItem Content="Item1"/>
        <ListBoxItem Content="Item2"/>
        <ListBoxItem Content="Item3"/>
        <ListBoxItem Content="Item4"/>
        <ListBoxItem Content="Item5"/>
        <ListBoxItem Content="Item6"/>
    </ListBox>
</Grid>
6
Dean Chalk

[プロパティ]タブには、trueとfalseの2つのオプションを持つ有効なフィールドがあります。これをfalseにすると、リストボックスは白のままになり、選択できなくなります。これを理解しただけです!

1
Dustin Poole

私はWP8アプリでやったトリックについて話している。

その上に透明なフレーム画像を追加しました(画像の境界線が見えました。画像フレームのように考えてください)。スクロールは機能的で、リストボックスアイテムが選択されなくなったという操作イベントが発生していました。

<Grid 
        Grid.Row="0" 
        Margin="10,15"
        Background="#FF008F88">
        <ListBox 
            x:Name="listBox_content" 
            Margin="20,15"
            VirtualizingStackPanel.VirtualizationMode="Recycling">
        </ListBox>

        <!-- TV image, middle is transparent so the ListBox can be seen -->
        <Image 
                x:Name="image_tv" 
                Source="/Assets/Images/tvFrame.png" 
                Stretch="Fill"/>
        <!---->
    </Grid>

これは、塗りつぶしに設定された完全に透明な画像でも機能すると思います。

1
JeFawk

ListBoxItemを再テンプレートする必要があります。デフォルトのテンプレートでは、IsSelectedプロパティがtrueの場合に自身を強調表示するトリガーがあります。そのトリガーを持たないテンプレートを作成するだけです。

0
decyclone