Сосредоточьтесь на другом элементе управления при выборе элементов в ListBox

У меня есть TextBox, который всегда должен быть в фокусе. В то же время у меня есть список. Когда пользователь нажимает на определенный элемент в этом листобоксе, выбранный элемент получает фокус.

Я попытался установить Focusable = "false" для каждого ListBoxItem в моем ListBox, но в этом случае нельзя выбрать ни один элемент. Я нашел следующий код с помощью dotPeek:

private void HandleMouseButtonDown(MouseButton mouseButton)
{
  if (!Selector.UiGetIsSelectable((DependencyObject) this) || !this.Focus())
    return;
  ...
}

Есть ли способ решить мою проблему?


person petka    schedule 26.09.2011    source источник
comment
Вы хотите выбрать элемент в списке, но не выделять этот элемент синим цветом?   -  person Upendra Chaudhari    schedule 26.09.2011
comment
Я хочу иметь возможность выбирать элемент списка с помощью мыши, но без потери фокуса на текстовом поле.   -  person petka    schedule 26.09.2011
comment
Вы можете снова установить фокус на текстовое поле в событии SelectionChanged списка.   -  person Upendra Chaudhari    schedule 26.09.2011
comment
Что ж, да, это сработает, но это довольно уродливое решение. TextBox и ListBox расположены в разных пользовательских элементах управления, поэтому ничего не знают друг о друге. Я бы предпочел реализовать свой собственный список и ListBoxItem, чем использовать такой подход.   -  person petka    schedule 26.09.2011
comment
Тогда вы сможете сделать одно. Вы должны найти это текстовое поле по отношению родитель / потомок. Не знаю, возможно это или нет. Если возможно, то мы можем найти это как в сети.   -  person Upendra Chaudhari    schedule 26.09.2011


Ответы (1)


Вы можете обработать PreviewMouseDown в ListBoxItems и пометить событие как обработанное, что остановит передачу фокуса.

Вы можете установить e.Handled = true, потому что MouseButtonEventArgs - это RoutedEventArgs.

Эта демонстрация позволяет сосредоточиться на TextBox:

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
    <StackPanel FocusManager.FocusedElement="{Binding ElementName=textBox}">
        <TextBox  x:Name="textBox" />
        <ListBox x:Name="listBox">
            <ListBoxItem PreviewMouseDown="ListBoxItem_PreviewMouseDown">1</ListBoxItem>
            <ListBoxItem PreviewMouseDown="ListBoxItem_PreviewMouseDown">2</ListBoxItem>
            <ListBoxItem PreviewMouseDown="ListBoxItem_PreviewMouseDown">3</ListBoxItem>
        </ListBox>
    </StackPanel>
</Window>

Отложенный код

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            var item = sender as ListBoxItem;
            if (item == null) return;
            listBox.SelectedItem = item;
            e.Handled = true;
        }
    }
}
person Grokodile    schedule 26.09.2011