gpt4 book ai didi

带有自定义控件的WPF选项卡顺序?

转载 作者:行者123 更新时间:2023-12-01 08:39:53 29 4
gpt4 key购买 nike

我有一个 WPF 页面,其中包含几个带有选项卡顺序的开箱即用控件。

我有一个自定义控件 (NumericSpinner),其中包含:边框/网格/文本框/2 个重复按钮(上/下)。

两个问题:

1) 当我在自定义选择器控件的文本框中时,我无法将其切换到页面上的其他控件。但是,在单击向上/向下箭头之一后,我可以切换到其他控件。

2) 我无法按顺序进入自定义控件的文本框。只有在我浏览了所有控件之后,光标才会落在文本框中(并且不能跳出)。

上下文:

<ComboBox Margin="97,315,21,0" Name="txtdweldatcdu" Style="{StaticResource fieldComboBoxStyle}" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" VerticalAlignment="Top" TabIndex="10" />
<WpfControls:NumericSpinner Margin="97,338,21,0" Name="txtdweldatpctcomplete" HorizontalAlignment="Left" VerticalAlignment="Top" AllowNegativeValues="True" MaxValue="100" TabIndex="11" />
<ComboBox Margin="97,363,21,0" Name="txtdweldatclass" Style="{StaticResource fieldComboBoxStyle}" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" VerticalAlignment="Top" TabIndex="12" />

自定义控件部分:

 <Border BorderThickness="1" BorderBrush="Gray" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="20" Width="117">
<Grid Margin="0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="98"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Name="valueText"
BorderThickness="0"
Grid.RowSpan="2"
Style="{StaticResource spinnerTextBoxStyle}"
PreviewKeyDown="valueText_PreviewKeyDown"
PreviewTextInput="valueText_PreviewTextInput"
TextChanged="valueText_TextChanged"
IsReadOnly="{Binding ElementName=Spinner, Path=IsReadOnly}"
Text="{Binding ElementName=Spinner, Path=Value, Mode=TwoWay}"
KeyboardNavigation.IsTabStop="True"
AcceptsTab="True"/>
<RepeatButton Name="upButton" Style="{StaticResource spinnerRepeatButtonStyle}" Click="upButton_Click" Grid.Column="1" Grid.Row="0" Height="10" Width="18" VerticalAlignment="Top" HorizontalAlignment="Right" HorizontalContentAlignment="Center">
<Polygon HorizontalAlignment="Center" Points="3,2 2,3 4,3" Fill="Black" Stretch="Uniform" Stroke="Black" StrokeThickness="0" />
</RepeatButton>
<RepeatButton Name="downButton" Style="{StaticResource spinnerRepeatButtonStyle}" Click="downButton_Click" Grid.Column="1" Grid.Row="1" Height="10" Width="18" VerticalAlignment="Top" HorizontalAlignment="Right" HorizontalContentAlignment="Center">
<Polygon HorizontalAlignment="Center" Points="2,2 4,2 3,3" Fill="Black" Stretch="Uniform" Stroke="Black" StrokeThickness="0" />
</RepeatButton>
</Grid>
</Border>

自定义控件由 xaml 和代码隐藏文件组成。

包含所有控件的父 xaml 页面是动态加载的,并且不包含任何代码隐藏。

在自定义控件的构造函数中,我设置了以下内容作为测试:

    valueText.TabIndex = 3;
this.TabIndex = 3;

第四次 tab 时,我实际上将光标移到了文本字段中,但是我无法跳出它。

考虑到这一点,第一步是创建一个控件参数,我可以传递一个在控件的代码隐藏中设置的 Tab 顺序号。

我创建了一个 CustomTabIndex 属性:

/// <summary>
/// Custom tab index property
/// </summary>
public int CustomTabIndex
{
get { return (int)GetValue(CustomTabIndexProperty); }
set { SetValue(CustomTabIndexProperty, value); }
}

public static readonly DependencyProperty CustomTabIndexProperty =
DependencyProperty.Register("CustomTabIndex", typeof(int), typeof(NumericSpinner));

在 xaml 中,当我尝试设置 CustomTabIndex="3"时,我收到错误:

The property 'CustomTabIndex' was not found in type 'NumericSpinner'.

我们将不胜感激。

最佳答案

我对第一个有答案...在 CustomControl 的静态构造函数中添加以下内容

KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(NumericSpinner), new FrameworkPropertyMetadata(KeyboardNavigationMode.Local));

这应该可以让您在控件中进出标签,并允许您为自定义控件的每个子项设置标签索引。

至于你的第二个问题,我正在努力解决同样的问题。我认为这必须归因于您的自定义控件具有 Focusable = False 的事实。但是将此设置为 true 将使控件获得焦点,而不是实际的 child 。我认为可能需要在您的 CustomControl 上为 GotFocus 事件设置一个事件处理程序。当控件获得焦点时,然后执行

this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

这应该将焦点移到子元素上。

当我找出正确的做法时,我会发布后续跟进。

更新

所以对于你的第二点。

确保在控件的静态构造函数中将 focusable 设置为 false 和 TabNavigationProperty

FocusableProperty.OverrideMetadata(typeof(NumericSpinner), new FrameworkPropertyMetadata(false));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(NumericSpinner), new FrameworkPropertyMetadata(KeyboardNavigationMode.Local));

这将允许控件按预期工作并尊重控件上的 Tab 键顺序以及所有子项。确保在您的样式中没有设置 Focusable 或 TabNavigation 属性。

劳尔

关于带有自定义控件的WPF选项卡顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4727999/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com