У меня есть UserControl, который содержит текстовое поле. Я хочу, чтобы клавиатура фокусировалась на этом текстовом поле программно, когда пользователь нажимает кнопку. Я пробовал:Как настроить клавиатурный фокус на текстовое поле внутри UserControl программно?
private void Button_Click(object sender,EventArgs e)
{
Keyboard.Focus(MyUserControl);
}
не повезло. Затем я выставил текстовое поле в UserControl, хотя свойство типа TextBox
private void Button_Click(object sender,EventArgs e)
{
Keyboard.Focus(MyUserControl.TextBox);
}
снова не повезло. Наконец, я сделал обработчик событий в UserControl для обработки события GotKeyboardFocus, вызвав метод Keyboard.Focus в текстовом поле внутри него.
Снова не повезло ?!
Как это сделать ??
EDIT: Проблема не связана с UserControls. Это проблема, когда вы пытаетесь передать фокус другому элементу UIElement в клике или MouseDownHandler. XAML en code ниже ниже расскажет свою историю: фокус действительно переходит в текстовое поле, но украден обратно в списке.
<Window x:Class="FocusSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<TextBox Name="FocusedTextBox" Height="30">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Text" Value="I am unfocused..."/>
<Setter Property="Opacity" Value=".3"/>
<Style.Triggers>
<Trigger Property="IsKeyboardFocused" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetProperty="FontSize" To="20"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Setter Property="Text" Value="I am focused!"/>
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<Button>Click to steal focus.</Button>
<ListBox>
<ListBoxItem GotFocus="Listbox_GotFocus">
<Label MouseDown="ListBoxItem_MouseDown">
Click to restore focus
</Label>
</ListBoxItem>
</ListBox>
</StackPanel>
</Window>
using System.Windows;
using System.Windows.Input;
namespace FocusSpike
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
FocusedTextBox.Focus();
}
private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e)
{
Keyboard.Focus(FocusedTextBox);//This does not work, remove it!
}
private void Listbox_GotFocus(object sender, RoutedEventArgs e)
{
//Keyboard.Focus(FocusedTextBox);//uncomment to restore focus!
}
}
}
или MyUserControl.TextBox.Focus() – Zenuka
Да, просто это иногда их не видно ... – tsilb
Спасибо за ответ. Это не работает, хотя ;-) Я начинаю подозревать, что фокус установлен на текстовое поле, но сразу же украден из него. Я буду исследовать дальше. – Dabblernl