【问题标题】:WPF Focus after Command - Why does it land on my Window?命令后的 WPF 焦点 - 为什么它落在我的窗口上?
【发布时间】: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


【解决方案1】:

我无法解释为什么 KeyboardFocus 会出现在我的窗口上,或者为什么我设置焦点的尝试没有效果。

但我终于找到了解决方案,我的尝试奏效了。

我使用了具有 BackgroundPriority 的 Dispatcher 来调用我的方法来设置焦点任何设置焦点到窗口的内容之后。这适用于键盘和鼠标输入。

    private void ViewModel_SuppliersAdded()
    {
        Dispatcher.BeginInvoke(new Action(SetFocusToFirstRow), DispatcherPriority.Background);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2011-09-17
    • 2012-09-17
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多