хммм Я пытался воспроизвести вашу проблему в небольшом тестовом проекте, но для меня это работает ... так что я думаю, вам придется рассказать больше о том, как создаются ваши пользовательские элементы управления. Вот что у меня работает:
Я создал пустой проект (как обычно, файлы приложения и окна) и настроил сетку с двумя столбцами в моем окне:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Name="Window"
SizeToContent="WidthAndHeight">
<Grid Name="MyGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
</Grid>
</Window>
затем создал userControl, который расширяет класс wpf TextBox:
<TextBox x:Class="Test.MyTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
</TextBox>
и
с использованием System.Windows;
использование System.Windows.Controls;
namespace Test
{
public partial class MyTextBox : TextBox
{
public static readonly DependencyProperty CaptionProperty =
DependencyProperty.Register("Caption", typeof(string), typeof(MyTextBox), new UIPropertyMetadata(""));
public string Caption
{
get { return (string)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
public MyTextBox()
{
InitializeComponent();
}
}
}
Это в основном текстовое поле с надписью "Подпись".
и теперь в коде моего окна:
public MainWindow()
{
InitializeComponent();
MyTextBox tb = new MyTextBox { Caption = "_Foo", Width = 100 };
Label lb = new Label { Content = tb.Caption + ":", Target = tb };
MyGrid.Children.Add(lb);
MyGrid.Children.Add(tb);
Grid.SetColumn(lb, 0);
Grid.SetColumn(tb, 1);
}
и с этим, я получаю фокус на TB, когда нажимаю ALT + F (я даже могу видеть _ под F "Foo" в Ярлыке, когда просто нажимаю ALT)
Так что я думаю, что ваша проблема связана с самими вашими элементами UserControls и тем, как они создаются (например, какой шаблон)
Изменить:
Если ваш элемент управления не расширяет существующий элемент управления, а содержит элемент управления WPF, проблема, вероятно, связана с методом Focus. Вам следует добавить метод Focus (), который устанавливает фокус на правой части элемента управления, когда сам элемент управления получает фокус.
код (для UserControl, содержащего текстовое поле, к которому вы хотите получить фокус, например):
<TextBox x:Class="Test.MyTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Content="foo" Grid.Column="0" />
<TextBox Name="TextBoxPart" Grid.Column="1" />
</Grid>
</TextBox>
код позади
public partial class MyTextBox : TextBox
{
public static readonly DependencyProperty CaptionProperty =
DependencyProperty.Register("Caption", typeof(string), typeof(MyTextBox), new UIPropertyMetadata(""));
public string Caption
{
get { return (string)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
public MyTextBox()
{
InitializeComponent();
}
protected override void OnGotFocus(RoutedEventArgs e)
{
TextBoxPart.Focus();
}
}
Редактировать 2:
Однажды у меня возникла проблема с переносом фокуса на субконтроль в dataGridCell, и вот что я сделал в шаблоне:
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="TextBoxPart" Property="FocusManager.FocusedElement" Value="{Binding ElementName=TextBoxPart}" />
</Trigger>
</ControlTemplate.Triggers>
Вы можете попробовать добавить это в свой шаблон. Это должно перенести ваш фокус в порядке.
Что касается доступности, я не думаю, что это поможет, но я не вижу никакого способа достичь того, чего вы хотите: - /