私はListBox
のアイテムのリストを表示するSilverlightアプリケーションを持っています。リストボックスのボタンを正しく使用するにはitemtemplate/datatemplate?
<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>
スタイルは非常に簡単です:各項目はので、私はこのようになりますItemContainerStyle
プロパティに適用されたスタイルを持っている私のアプリケーションの異なる「ページ」を表しています。 ListBoxItem
のビジュアル状態が「選択済み」に等しい場合は、単にBorder
と表示されます。項目が「選択済み」状態のときにForeground
プロパティを変更できるようにするため、内容はContentControl
によってホストされていることに注意してください。
下記のスクリーンショットで見ることができるように、これは見事に動作します:今、私は私が持っていたアイデアは、それぞれの内容を設定しますDataTemplate
を作成することでしたので、選択した項目は、ナビゲーションを呼び出したい
HyperLinkButton
のアイテム:
<DataTemplate x:Key="navigationListBoxItemTemplate">
<HyperlinkButton Content="{Binding}"
Background="Transparent"/>
</DataTemplate>
さて、これはそれがContentControl
なく、のコンテンツですItemTemplate
ホストとして動作しません。だからを代わりに使用するようにListBoxItem
テンプレートを更新しなければならなかった。
<ContentPresenter x:Name="content" Margin="10,5"/>
私は今、次のような結果を得る:私は今、もはや選択されているHyperLinkButton
ListBoxItem
をクリックすると
(私はHyperLinkButton
外でちょうどクリックするとListBoxItem
が選択された状態になるが) 。私が本当に欲しいのは、HyperLinkButton
がクリックされたときにListBoxItem
が選択されることです。 HyperLinkButton
には選択の概念がないので、ListBoxItem
のIsSelected
プロパティにバインドすることはできません。
注:実際のナビゲーションは完全に動作しますが、問題は純粋にListBoxItems
の外観です。
だから私の質問は以下のとおりです。HyperLinkButton
がクリックされた場合、ListBoxItem
は最初の画像のように、選択になるよう
- は、私はそれを作ることはできますか?
HyperLinkButton
のフォアグラウンドを変更する方法も必要です。これは、ContentControl
からContentPresenter
を交換してアイテムテンプレートでこれ以上行われないためです。
注:私はおそらく私のViewModelにListBox
のSelectedItem
プロパティを結合し、各ListBoxItem
が主催HyperLinkButton
を持っている必要性を否定するが、私はかどうかを知るに興味があっナビゲーションを処理することで、この問題を解決することができスタイルとテンプレートを使用して私の望む結果を達成することは可能です。
更新
私はこれを試してみて、解決するために物事のカップルを試してみましたが、これまでのところ成功していません。私が試した最初の試みは、DataTemplate
のHyperLinkButton
コントロールに新しいスタイルを適用することでした。これは本質的にすべてのデフォルトのルックアンドフィールをコントロールから削除しますが、私のアプリケーションは上記のように動作します。
私が試したもう1つのことは、IsHitTestVisible
プロパティをfalseに設定していたことです。これにより、HyperLinkbutton
を「スルー」してListBoxItem
を選択することができますが、ナビゲーションがもう呼び出されなくなりました。
こんにちは、listBox_SelectionChanged()イベントハンドラ内でNavigationService.Navigate(Uri)メソッドを使用できますか? – prthrokz
@prthrokz - ナビゲーションメソッドを呼び出す際に問題はありません。私の問題は純粋に 'ListBoxItem'のプレゼンテーションです。 –
HyperLinkButtonの追加を実質的に省略することができるという私の意図は、投稿から理解したことは、ナビゲーションを呼び出すために切り替えなければならなかったからです。 – prthrokz