5

にアイテムのリストを表示する 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、コンテンツは によってホストされていることに注意してください。ContentControlForeground

以下のスクリーンショットでわかるように、これは見事に機能します。

ここに画像の説明を入力

ここで、選択したアイテムでナビゲーションを呼び出したいので、DataTemplate各アイテムのコンテンツを に設定する を作成するという考えがありましたHyperLinkButton

<DataTemplate x:Key="navigationListBoxItemTemplate">
    <HyperlinkButton Content="{Binding}" 
                     Background="Transparent"/>
</DataTemplate>

現在、これはコンテンツがではなくにあるItemTemplateホストとして機能しないため、代わりに を使用するようにテンプレートを更新する必要がありました。ContentControlContentPresenterListBoxItemContentPresenter

<ContentPresenter x:Name="content" Margin="10,5"/>

次の結果が得られます。

ここに画像の説明を入力

をクリックするとHyperLinkButtonListBoxItemが選択されなくなりました ( のすぐ外側をクリックするHyperLinkButtonと、ListBoxItemが選択されます)。私が本当に欲しいのは、がクリックListBoxItemされたときに が選択されるようにすることです。HyperLinkButtonには選択の HyperLinkButton概念がないため、ListBoxItemIsSelectedプロパティにバインドできません。

注:実際のナビゲーションは完全に機能しますが、問題は純粋にListBoxItems.

だから私の質問は:

  1. HyperLinkButtonをクリックするListBoxItemと最初の画像のように が選択されるようにできますか?
  2. HyperLinkButtonまた、 を から に交換したため、アイテム テンプレートではこれが行われなくなったため、 が選択されたときにのContentControl前景を変更する何らかの方法が必要になりContentPresenterます。

注:SelectedItemのプロパティをviewModelListBoxにバインドし、そこでナビゲーションを処理することでこの問題を解決できる可能性があります。 .HyperLinkButtonListBoxItem

アップデート

これを解決するためにいくつかのことを試みましたが、これまでのところ成功していません。最初に試したのは、新しいスタイルをHyperLinkButtonコントロールに適用することでした。DataTemplateこれにより、コントロールからデフォルトのルック アンド フィールがすべて削除されますが、アプリケーションは依然として上記のように動作します。

2 番目に試みたのは、IsHitTestVisibleプロパティを false に設定することでした。これにより、 をクリックしてHyperLinkbuttonを選択できますがListBoxItem、これは、ナビゲーションが呼び出されなくなったことを意味します。

4

1 に答える 1

0

ListBoxItem が選択されていないのは、Button (そのタイプに関係なく) が MouseLeftButtonDown イベントを Handled としてマークしているためです。したがって、必要なイベントは親の ListBoxItem までバブルアップしません。

明らかに、あなたの ListBoxItem はクリックからフォーカスを得ているので (最終的な画像の境界線であると思います)、これは関係なく発生する必要があります。

内部的には、ListBoxItem には、Selection を処理するために設定された標準の LeftMouseButtonDown イベント ハンドラがあり、フォーカスの設定を処理するために AddHandler を呼び出す必要があります。


次のように、イベントに独自のハンドラーを追加することで、同様のことを実現できます。

 listboxitem.AddHandler(UIElement.MouseLeftButtonDownEvent, new System.Windows.Input.MouseButtonEventHandler(MyMouseLeftButtonDownEventHandler), true);

最後のパラメーターは、処理されたイベントを処理するようにハンドラーに指示します...

このハンドラーのアタッチはお任せしますが、ビヘイビアーを使用するのがおそらく最も簡単です。Button から型をイベント派生させ、ビジュアル ツリーを上って ListBoxItem を見つけて選択させることができます。可能性は無限大です。

于 2013-02-05T07:20:08.793 に答える