【发布时间】:2018-01-30 21:15:23
【问题描述】:
我正在尝试制作一个带有搜索框和结果列表的小型模式窗口。 我的目标是让焦点在搜索后落在 List 的第一个元素上。
问题
不幸的是,我陷入了搜索后焦点落在窗口本身的情况。
我的TextBox 有一个InputBinding,在输入时触发以执行搜索:
<TextBox Grid.Column="1" Grid.Row="1"
Text="{Binding Supplier.LeverandorNavn, UpdateSourceTrigger=PropertyChanged}"
x:Name="txtBoxSupplierName" Width="150"
HorizontalAlignment="Left" VerticalAlignment="Top"
TabIndex="1">
<TextBox.InputBindings>
<KeyBinding Key="Return" Command="{Binding SearchCommand}" />
</TextBox.InputBindings>
</TextBox>
我一直在尝试使用Snoop 来了解事件的流程。
如此处所示,KeyDown 由我的 txtBoxSupplerName Textbox 处理。
但我不明白为什么在我的命令执行后levWindow 会获得焦点。
我尝试手动设置焦点元素,但没有效果。
问题
谁能给我解释一下,为什么焦点默认落在窗口上?
有人可以建议一种方法,让我自己控制焦点并避免这种默认行为吗?
-
DataGrid需要一些时间来重绘自身,然后才能看到我想要聚焦的行,这让我感到挑战。
属性
public ClientLeverandor ValgtLeverandør
{
get { return _valgtLeverandør; }
set { SetProperty(ref _valgtLeverandør, value, nameof(ValgtLeverandør)); }
}
public ObservableCollection<ClientLeverandor> Leverandører
{
get { return _leverandører; }
private set { SetProperty(ref _leverandører, value, nameof(Leverandører)); }
}
public ListCollectionView LeverandørView
{
get { return _leverandørView; }
set { SetProperty(ref _leverandørView, value, nameof(LeverandørView)); }
}
命令实现
using (BusyIndicator.ShowInScope(Strings.HenterData_BusyText))
{
var leverandører = await SøgLeverandører(Supplier);
if (leverandører.Any())
{
Leverandører.Clear();
foreach (var lev in leverandører) Leverandører.Add(lev);
ValgtLeverandør = Leverandører[1];
SuppliersAdded?.Invoke();
}
}
【问题讨论】:
-
如果你注释命令的代码怎么办?
-
焦点实现在 WPF 中是非常糟糕的事情。当然还有辅助方法、逻辑/键盘焦点、作用域等,但要让所有这些废话工作起来真的很困难。最好的办法是在代码后面手动处理焦点(在 MVVM 世界中,我们使用 attached behaviors)。
-
感谢 Sinatr 的链接。我目前正准备尝试调试链接中提到的 .Net 框架,稍后我将研究附加行为建议。
标签: c# wpf events command focus