Avalonia窗体中如何强制让TextBox获取键盘输入焦点
让Avalonia窗体显示时TextBox自动获取焦点
我有一个仅包含单个TextBox的Avalonia窗体,窗体显示时输入框不会自动获得键盘焦点,必须按Tab键才能输入内容,如何让TextBox在窗体显示时自动获取焦点?
原始AXAML代码
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="SpaceDunyal.Forms.Window1" Title="MyWindow"> <StackPanel Margin="10"> <TextBox Name="MyInput" Watermark="Input your text"/> </StackPanel> </Window>
原始C#代码
using Avalonia.Controls; namespace SpaceDunyal.Forms { public partial class Window1 : Window { public Window1() { InitializeComponent(); MyInput.Focus(); // 无效果 } } }
解决方案
方案1:通过AXAML直接设置初始焦点
在Window标签中添加FocusManager.FocusedElement属性,绑定到目标TextBox,无需编写C#代码即可实现自动聚焦:
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="SpaceDunyal.Forms.Window1" Title="MyWindow" FocusManager.FocusedElement="{Binding ElementName=MyInput}"> <StackPanel Margin="10"> <TextBox Name="MyInput" Watermark="Input your text"/> </StackPanel> </Window>
方案2:在窗体加载完成后调用Focus
原始代码中MyInput.Focus()无效的核心原因是:Window构造函数执行时,控件还未完全加载到可视化树,布局也未完成,此时调用焦点设置不会生效。需要在窗体加载完成后再执行聚焦操作,有两种实现方式:
方式A:重写OnLoaded方法
using Avalonia.Controls; namespace SpaceDunyal.Forms { public partial class Window1 : Window { public Window1() { InitializeComponent(); } protected override void OnLoaded(RoutedEventArgs e) { base.OnLoaded(e); MyInput.Focus(); } } }
方式B:订阅Loaded事件
using Avalonia.Controls; using Avalonia.Interactivity; namespace SpaceDunyal.Forms { public partial class Window1 : Window { public Window1() { InitializeComponent(); Loaded += Window1_Loaded; } private void Window1_Loaded(object sender, RoutedEventArgs e) { MyInput.Focus(); } } }
内容的提问来源于stack exchange,提问作者Pavel Sumarokov
相关产品推荐
相关产品推荐

