在ListBox中选择项目时,请将注意力集中在另一个控件上

时间:2011-09-26 10:53:36

标签: wpf focus listboxitem

我有TextBox,它应该始终处于焦点。 同时我有列表框。 当用户点击此列表框中的某个项目时,单击的项目将获得焦点。

我尝试为ListBox中的每个ListBoxItem设置 Focusable =“false”,但在这种情况下,不能选择任何项目。 我使用dotPeek找到了以下代码:

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

有什么方法可以解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

您可以在ListBoxItems上处理PreviewMouseDown并将事件标记为Handled,这将停止传输焦点。

您可以设置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;
        }
    }
}