2
<Grid x:Name="LayoutRoot">
    <Button x:Name="BtnNavigateTabIndex" Content="NavigateTabIndex" Margin="152,200,0,190" HorizontalAlignment="Left" Width="120"/>
    <TextBox x:Name="TextBox_1" HorizontalAlignment="Left" Height="48" Margin="120,64,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="80"/>
    <TextBox x:Name="TextBox_2" HorizontalAlignment="Left" Height="48" Margin="120,128,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="80"/>
    <PasswordBox x:Name="PasswordBox_1" HorizontalAlignment="Left" Height="48" Margin="224,64,0,0" VerticalAlignment="Top" Width="72"/>
    <PasswordBox x:Name="PasswordBox_2" HorizontalAlignment="Left" Height="48" Margin="224,128,0,0" VerticalAlignment="Top" Width="72"/>
</Grid>

デザインは以下のようになります。

ここに画像の説明を入力してください

ボタン(NavigateTabIndex)をクリックすると、カーソルがTextBoxまたはPasswordBoxに移動します。例:キーボードのTabキーをクリックすると、カーソルが移動します。これが必要なシナリオです。

4

2 に答える 2

3

一般に、WPFに焦点を当てた落とし穴がたくさんあります....いくつかのバグもあります。

論理フォーカスとキーボードフォーカスの違いを理解する必要があります。

FocusScopesを使用する場合、次を使用できます。

MoveFocusとともにTraversalRequest(FocusNavigationDirection.Next)

論理フォーカスをスコープ内の次の項目に変更します。

FocusScopesを使用する代わりに、GotFocus / LostFocusイベントを追跡し、自分で管理することもできます。

その他のリンク:


さて、ここにあなたのためのいくつかのサンプルコードがあります。私は自由にグリッドの使用法を少し再設計し、より一般的なレイアウトの慣習に従いました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 WpfApplication5
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnNavigateTabIndex_Click(object sender, RoutedEventArgs e)
        {
            UIElement focussedelement = FocusManager.GetFocusedElement(grid1) as UIElement;

            bool bmovedfocus = focussedelement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

            if (bmovedfocus)
            {
                UIElement withfocusnow = FocusManager.GetFocusedElement(grid1) as UIElement;

                if (withfocusnow == focussedelement) // focus didn't change! because end of focus group..need to put it back to the start
                {
                    TextBox_1.Focus();
                }
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            TextBox_1.Focus();
        }
    }
}


    <Window x:Class="WpfApplication5.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication5"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <StackPanel>
            <Grid x:Name="grid1" FocusManager.IsFocusScope="True">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBox Margin="10" Grid.Row="0" Grid.Column="0" x:Name="TextBox_1" HorizontalAlignment="Left" Height="48" TextWrapping="Wrap" VerticalAlignment="Top" Width="80"/>
                <PasswordBox Margin="10" Grid.Row="0" Grid.Column="1" x:Name="PasswordBox_1" HorizontalAlignment="Left" Height="48" VerticalAlignment="Top" Width="72"/>
                <TextBox Margin="10" Grid.Row="1" Grid.Column="0" x:Name="TextBox_2" HorizontalAlignment="Left" Height="48" TextWrapping="Wrap" VerticalAlignment="Top" Width="80"/>
                <PasswordBox Margin="10" Grid.Row="1" Grid.Column="1" x:Name="PasswordBox_2" HorizontalAlignment="Left" Height="48" VerticalAlignment="Top" Width="72"/>
                <Button FocusManager.IsFocusScope="True" Padding="20" HorizontalAlignment="Center" Grid.Row="2" Grid.ColumnSpan="2" x:Name="BtnNavigateTabIndex" Content="NavigateTabIndex"  Width="120" Click="BtnNavigateTabIndex_Click" />
            </Grid>
        </StackPanel>
    </Window>
于 2012-08-28T11:20:01.653 に答える
-1

このコード行は、正しい方向に進むはずです。

element.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

ここで、elementはUIElementです(テキストボックスの1つと同様)。これは、次の投稿からの抜粋です。WPFのEnterキーを押して次のコントロールに移動します。そして、このコードをボタンのクリックイベントハンドラーに配置します...

ちなみに、アクティブなUIElement /ユーザーコントロールが何であるかを見つけるには、ここで説明するように行うことができます。

于 2012-08-28T11:19:53.013 に答える