にアイテムのリストを表示する Silverlight アプリケーションがありますListBox
。各アイテムはアプリケーションの異なる「ページ」を表すため、プロパティに適用されるスタイルはItemContainerStyle
次のようになります。
<Style x:Key="navigationItemContainerStyle" TargetType="ListBoxItem">
<Setter Property="Margin" Value="5,3"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Cursor="Hand">
<VisualStateManager.VisualStateGroups>
<!-- code omitted --!>
</VisualStateManager.VisualStateGroups>
<Border x:Name="contentBorder"
Background="{StaticResource navigationHighlightBrush}"
CornerRadius="3"
Opacity="0"/>
<ContentControl x:Name="content"
Margin="10,5"
Content="{Binding}"
Foreground="DarkGray"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
スタイルはとてもシンプルです。の表示状態が「選択済み」に等しいBorder
場合に表示するだけです。アイテムが「選択済み」状態のときにプロパティを変更できるようにしたいのでListBoxItem
、コンテンツは によってホストされていることに注意してください。ContentControl
Foreground
以下のスクリーンショットでわかるように、これは見事に機能します。
ここで、選択したアイテムでナビゲーションを呼び出したいので、DataTemplate
各アイテムのコンテンツを に設定する を作成するという考えがありましたHyperLinkButton
。
<DataTemplate x:Key="navigationListBoxItemTemplate">
<HyperlinkButton Content="{Binding}"
Background="Transparent"/>
</DataTemplate>
現在、これはコンテンツがではなくにあるItemTemplate
ホストとして機能しないため、代わりに を使用するようにテンプレートを更新する必要がありました。ContentControl
ContentPresenter
ListBoxItem
ContentPresenter
<ContentPresenter x:Name="content" Margin="10,5"/>
次の結果が得られます。
をクリックするとHyperLinkButton
、ListBoxItem
が選択されなくなりました ( のすぐ外側をクリックするHyperLinkButton
と、ListBoxItem
が選択されます)。私が本当に欲しいのは、がクリックListBoxItem
されたときに が選択されるようにすることです。HyperLinkButton
には選択の HyperLinkButton
概念がないため、ListBoxItem
のIsSelected
プロパティにバインドできません。
注:実際のナビゲーションは完全に機能しますが、問題は純粋にListBoxItems
.
だから私の質問は:
HyperLinkButton
をクリックするListBoxItem
と最初の画像のように が選択されるようにできますか?HyperLinkButton
また、 を から に交換したため、アイテム テンプレートではこれが行われなくなったため、 が選択されたときにのContentControl
前景を変更する何らかの方法が必要になりContentPresenter
ます。
注:SelectedItem
のプロパティをviewModelListBox
にバインドし、そこでナビゲーションを処理することでこの問題を解決できる可能性があります。 .HyperLinkButton
ListBoxItem
アップデート
これを解決するためにいくつかのことを試みましたが、これまでのところ成功していません。最初に試したのは、新しいスタイルをHyperLinkButton
コントロールに適用することでした。DataTemplate
これにより、コントロールからデフォルトのルック アンド フィールがすべて削除されますが、アプリケーションは依然として上記のように動作します。
2 番目に試みたのは、IsHitTestVisible
プロパティを false に設定することでした。これにより、 をクリックしてHyperLinkbutton
を選択できますがListBoxItem
、これは、ナビゲーションが呼び出されなくなったことを意味します。