ListBoxが選択された項目を強調表示しないようにする方法を見つけるのに問題があります。アイテムを強調表示するトリガーを追加しなかったことを知っています。
<ListBox Name="CartItems" ItemsSource="{Binding}"
ItemTemplate="{StaticResource TicketTemplate}"
Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent"
BorderBrush="Transparent">
</ListBox>
遅い答えですが、はるかに優れたシンプルなソリューションがあります:
<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に感謝
<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>
強調表示を完全に削除することは非常に奇妙に感じます。何かを選択したかどうかはわかりませんが、ここでは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>
[プロパティ]タブには、trueとfalseの2つのオプションを持つ有効なフィールドがあります。これをfalseにすると、リストボックスは白のままになり、選択できなくなります。これを理解しただけです!
私は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>
これは、塗りつぶしに設定された完全に透明な画像でも機能すると思います。
ListBoxItem
を再テンプレートする必要があります。デフォルトのテンプレートでは、IsSelected
プロパティがtrue
の場合に自身を強調表示するトリガーがあります。そのトリガーを持たないテンプレートを作成するだけです。