1

TextBoxコントロールから項目が選択された後にフォーカスを設定したいのListViewですが、「SelectionChanged」イベント メソッド内からフォーカスを取得できないようですFocusOnTextBox()

何らかの理由でListView、選択が行われた後は常にフォーカスがあります。

この問題を示すために、Visual Studio アプリケーションを作成しました。

http://maq.co/focusapp.zip

TextBox「SelectionChanged」イベント メソッド内でフォーカスを元に戻すにはどうすればよいですか?

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内からフォーカスを切り替えても固定されません。SelectionChangedListView

関数にブレークポイントを設定しFocusOnTextBoxてコールスタックを見ると、スタックの奥深くにいることがわかります。関数の実行ListView後に実行することがたくさんあります。FocusOnTextBoxそれが行うことの1つは、で選択したアイテムにフォーカスを設定することだと思います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 に答える