6

私はテンプレートListBoxを持っているので、それらは含まれていますListBoxItemsTextBoxes

テキストボックス付きリストボックス

がフォーカスされたらTextBox、 を選択したいListBoxItem。私が見つけた1つの解決策は次のようになります。

<Style TargetType="{x:Type ListBoxItem}">
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="IsSelected" Value="True"></Setter>
        </Trigger>
    </Style.Triggers>
</Style>

これはうまく機能TextBoxしますが、フォーカスが失われると、選択も失われます。

これを防ぐ方法はありますか?

4

3 に答える 3

15

コードビハインドなしでこれを行うために私が見つけた最良の解決策はこれです:

<Style TargetType="{x:Type ListBoxItem}">
    <Style.Triggers>
        <EventTrigger RoutedEvent="PreviewGotKeyboardFocus">
            <BeginStoryboard>
                <Storyboard>
                    <BooleanAnimationUsingKeyFrames
                        Storyboard.TargetProperty="(ListBoxItem.IsSelected)">

                        <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
                    </BooleanAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>
于 2013-03-13T11:02:35.463 に答える
0

また、テキスト ボックスにフォーカスしたままにすることもできますが、コード ビハインドを使用して、常に 1 つの ListBoxItem のみを選択できます。

ListBox XAML で:

<ListBox
PreviewLostKeyboardFocus="CheckFocus">
</ListBox>

次に、CheckFocus()コード ビハインドのメソッドで:

/* Cause the original ListBoxItem to lose focus
    * only if another ListBoxItem is being selected.
    * If a different element type is selected, the
    * original ListBoxItem will keep focus.
    */
private void CheckFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    // check if focus is moving from a ListBoxItem, to a ListBoxItem
    if (e.OldFocus.GetType().Name == "ListBoxItem" && e.NewFocus.GetType().Name == "ListBoxItem")
    {
        // if so, cause the original ListBoxItem to loose focus
        (e.OldFocus as ListBoxItem).IsSelected = false;
    }
}
于 2015-10-16T16:02:03.710 に答える