Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF选项卡键导航_C#_Wpf_Navigation_Controls - Fatal编程技术网

C# WPF选项卡键导航

C# WPF选项卡键导航,c#,wpf,navigation,controls,C#,Wpf,Navigation,Controls,我们有一个基于WPF.NET4.0C的应用程序。我们从XML定义(而不是XAML)构建了用户界面,但在下面我们使用WPF来表示UI。也就是说,在运行时,我们根据XML定义创建WPF UI 选项卡导航有问题。我们为文本和组合框控件设置TabStop、TabIndex。 但是选项卡导航不起作用。如何使选项卡导航适用于此布局 您应该尝试在树控件或堆栈面板派生控件上设置附加属性,以防底部按钮也参与制表符循环: <controls:CustomStackPanel KeyboardNavigatio

我们有一个基于WPF.NET4.0C的应用程序。我们从XML定义(而不是XAML)构建了用户界面,但在下面我们使用WPF来表示UI。也就是说,在运行时,我们根据XML定义创建WPF UI

选项卡导航有问题。我们为文本和组合框控件设置TabStop、TabIndex。

但是选项卡导航不起作用。如何使选项卡导航适用于此布局

您应该尝试在
控件或
堆栈面板
派生控件上设置附加属性,以防底部按钮也参与制表符循环:

<controls:CustomStackPanel KeyboardNavigation.TabNavigation="Cycle">
 <Tree>
 ...
 </Tree>
</controls:CustomStackPanel>

...

您甚至可以将一种代码隐藏方法与
键盘导航相结合,我认为您目前正试图使用这种方法来控制树控件内的选项卡行为。TabNavigation
负责树控件外的选项卡操作。

WPF将整个UI树视为单个选项卡范围。它并没有像你预期的那样被分割成更小的区域。这包括UserControls中的控件

例如,如果你有

<StackPanel>
    <TextBox Name="TextBox1" />
    <MyUserControl />
    <TextBox Name="TextBox3" />
</StackPanel>
默认的制表符周期为TextBox1、TextBox2、TextBox3。这是因为没有定义TabIndex属性,所以所有控件都以默认的选项卡顺序运行,即它们添加到UI的顺序

如果在控件上设置TabIndex,如下所示

<StackPanel>
    <TextBox Name="TextBox1" TabIndex="1" />
    <MyUserControl TabIndex="2" />
    <TextBox Name="TextBox3" TabIndex="3" />
</StackPanel>

我通常更喜欢在UserControl的
Loaded
事件中设置此绑定,而不必记住在UserControl内的所有控件上设置此绑定。我相信也有更有效的方法来实现这一点,但是这个问题还没有经常出现,我没有坐下来花时间研究如何正确使用制表符范围来避免这种解决方法。

这本身并不是一个答案,但WPF制表非常灵活。需要在Xaml中设置TabNavigation、IsTabStop属性,并摆弄焦点范围。我已经花了好几天的时间试图单独使用Xaml来正确地进行tabing。我建议从XML->WPF模型开始,实际上应该是Xaml->WPF!但是我想那是不可能的

作为一个解决办法,这个怎么样。您可以在生成的代码中处理制表符吗?如果您的WPF用户控件是由您自己的软件从您自己的XML生成的,那么我建议在您的XML中放置一个TabOrder元素,然后使用它连接一个TabOut事件

查看以下代码示例,以强制代码中的移动操作(类似于制表符)

其次,连接到“tabbable”控件的KeyUp(或PreviewKeyUp)事件,如果键是tab,则调用上述代码以使焦点跳到下一个元素

上面的代码示例将基本上强制代码中WPF应该做的事情。正如其他海报所建议的那样,我将浏览您生成的WPF代码,以了解KeyboardNavigation.IsTabStop和KeyboardNavigation.TabNavigation的值

致以最诚挚的问候,

试试看
KeyboardNavigation.TabNavigation=“Once”

你看过这个类了吗?你是如何在这个界面的代码隐藏中为你的控件设置TabIndex属性的?你需要更清楚什么不起作用。发布一些代码。你说的“不工作”是什么意思?是“你点击了标签,但焦点不动”吗?或者它移动,但移动错误?在哪方面是错误的?“但是标签导航不起作用”-你的确切意思是什么?它是随机跳跃还是完全不跳?顺便说一句,如果你不设置任何TabIndex,它将按照你添加子项的顺序跳转。一般来说,不确定如何显式处理该选项卡-这似乎有点老套+1对于MoveFocus的东西-我发现我需要它来处理一个自定义控件的shift+tab,其中一些东西正在更改其可见性。在我的例子中,有人在删除一组控件后,将其设置为“Focusable=”False“,然后将其添加到窗口(或网格,无所谓)。成功了!!谢谢
<StackPanel>
    <TextBox Name="TextBox1" TabIndex="1" />
    <MyUserControl TabIndex="2" />
    <TextBox Name="TextBox3" TabIndex="3" />
</StackPanel>
<MyUserControl>
    <TextBox Name="TextBox2" TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}}" />
</MyUserControl>
// Creating a FocusNavigationDirection object to perform the tab operation
// values include Next, Previous, First, Last etc...
FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;

// MoveFocus takes a TraveralReqest as its argument.
TraversalRequest request = new TraversalRequest(focusDirection);

// Gets the element with keyboard focus.
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

// Change keyboard focus.
if (elementWithFocus != null)
{
    elementWithFocus.MoveFocus(request);
}