1

我希望在TextBoxListView控件中选择项目后将焦点设置在 a 上,但我似乎无法从我的 'SelectionChanged' 事件方法中获得焦点FocusOnTextBox()

出于某种原因,ListView在做出选择后总是有焦点。

我创建了一个 Visual Studio 应用程序来演示这个问题:

http://maq.co/focusapp.zip

如何TextBox在“SelectionChanged”事件方法中让焦点返回到 from?

MainWindow.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">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <ListView Name="list_view1" Grid.Column="0" SelectionChanged="FocusOnTextBox">
            <ListViewItem Content="1" />
            <ListViewItem Content="2" />
            <ListViewItem Content="3" />
        </ListView>
        <TextBox Name="text_box1" Grid.Column="1" Text="When a selection is chosen from the left hand side ListView, I want THIS word to be selected and for the focus to change to this text box - this will show the selection to the user.&#x0a;&#x0a;However, right now it doesn't seem to work, the focus remains on the ListView regardless of it being set to Focus() in the FocusOnTextBox() method, which is fired on the 'SelectionChanged' event." TextWrapping="Wrap" />
    </Grid>
</Window>

MainWindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

            // Test that the selection of the word THIS and the Focus() works
            text_box1.SelectionStart = 68;
            text_box1.SelectionLength = 4;

            text_box1.Focus();
        }

        private void FocusOnTextBox(object sender, SelectionChangedEventArgs e)
        {
            MessageBox.Show("FocusOnTextBox fired on selection with list view");

            text_box1.SelectionStart = 68;
            text_box1.SelectionLength = 4;

            text_box1.Focus();
        }
    }
}
4

1 回答 1

2

我相信发生这种情况是因为ListView尚未完成更改选择,因此您从SelectionChanged事件处理程序中切换焦点不会坚持,因为在您更改焦点ListView后,为了完成其选择更改流程而将其更改回来。

如果你在FocusOnTextBox函数中设置断点并查看调用堆栈,你会发现你已经深入堆栈,并且ListView在你的FocusOnTextBox函数执行后会有很多事情要做。我想它会做的一件事是将焦点设置到ListView.

如果您更改它以便在ListView完成更改当前选择后转移焦点,它应该可以工作。例如,更改它以便您在MouseLeftButtonUp似乎工作中切换焦点:

<ListView Name="list_view1" Grid.Column="0" MouseLeftButtonUp="FocusOnTextBox">
    <ListViewItem Content="1" />
    <ListViewItem Content="2" />
    <ListViewItem Content="3" />
</ListView>

然后您需要更改FocusOnTextBox要使用的事件处理程序定义,MouseEventArgs而不是SelectionChangedEventArgs同时使用。

于 2013-03-06T18:55:54.350 回答