【发布时间】:2012-12-06 23:30:42
【问题描述】:
我正在努力解决在 wpf 中看起来如此简单的问题,但我还没有发现为什么我不能让我的应用程序按照我的计划运行。
当用户按下 ctrl+f 时,我的 wpf 应用程序中会弹出一个小的搜索框。我想要的只是插入符号在搜索框文本框中闪烁,准备好接受任何用户输入,而无需用户单击它。这是文本框的 xaml 代码,它是可见的、启用的、可点击测试的、可制表符的和可聚焦的。
<TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />
在后面的代码中,当搜索框的可见性受到影响时,我会调用此方法。搜索框在应用启动时加载。
/// <summary>
/// Handles events triggered from focusing on this view.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="dependencyPropertyChangedEventArgs">The key event args.</param>
private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
{
return;
}
SearchCriteriaTextBox.Focus();
Keyboard.Focus(SearchCriteriaTextBox);
SearchCriteriaTextBox.Select(0, 0);
if (SearchCriteriaTextBox.Text.Length > 0)
{
SearchCriteriaTextBox.SelectAll();
}
}
问题是,代码被调用,组件变为 IsFocused=true 但没有获得键盘焦点。 我错过了什么吗?除非另一个控件一直保持在我很确定我没有编码的键盘焦点上,否则为什么这段相当简单的代码不能正常工作。
【问题讨论】:
-
在 Loaded 事件之后尝试这样做。
-
我猜想在调用此方法后另一个控件会获得焦点。也许你应该把焦点放在另一个事件上。
-
@HighCore 我有一个问题:每次可见性变化时都会触发 Loaded 事件吗?
-
不。它在控件加载时触发,但由于您没有发布足够的代码来了解您如何创建或显示您的控件,我只是在猜测。
-
您的 OnIsVisibleChanged 代码实际上解决了我自己的问题!