【问题标题】:How to navigate cursor with TabIndex by click on button in wpf?如何通过单击 wpf 中的按钮使用 TabIndex 导航光标?
【发布时间】:2012-08-28 11:03:18
【问题描述】:
<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。 对于 EX:如果您单击键盘中的 Tab 键,光标将导航。这就是我需要的场景。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    一般来说,专注于 WPF 有很多陷阱......甚至有些错误。

    您需要了解逻辑和键盘焦点之间的区别。

    使用 FocusScopes 时,您可以使用:

    MoveFocusTraversalRequest(FocusNavigationDirection.Next)

    将逻辑焦点更改为范围内的下一项。

    使用 FocusScopes 的替代方法是跟踪 GotFocus/LostFocus 事件并自行管理。

    更多链接:


    好的,这里有一些示例代码。我冒昧地重新设计了您对 Grid 的使用,以遵循更传统的布局实践。

    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>
    

    【讨论】:

    • 我试过这个代码 this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));但它不起作用。请把完整的程序发给我。它会好得多。
    • 我在 wpf 中处于初级阶段。我无法理解你的意思。如果您发布完整的代码,它将对我有所帮助。
    • 以上代码运行良好。感谢您宝贵的时间。
    【解决方案2】:

    这行代码应该会让你朝着正确的方向前进:

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

    其中 element 是 UIElement(就像您的文本框之一)。这是以下帖子的摘录:Moving to next control on Enter keypress in WPF。而你把这段代码放在按钮的点击事件处理程序上......

    顺便说一句:发现活动的 UIElement / 用户控件是什么,可以按照here 的描述来完成。

    【讨论】:

    • 我使用这个代码元素。MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));。但这行不通……请把完整的程序发给我。
    • 来吧 ASHOKA 多一点勇气和努力来完成这项工作。太简单了。我不会发布整个程序:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2023-03-04
    • 2021-07-03
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多