Сосредоточиться на другом элементе управления при выборе элементов в ListBox - PullRequest
1 голос
/ 26 сентября 2011

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

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

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

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

1 Ответ

0 голосов
/ 26 сентября 2011

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

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

Эта демонстрация работает для фокусировки на текстовом поле:

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;
        }
    }
}
...