gpt4 book ai didi

c# - 在 WPF 中处理 GUI 上的选定对象

转载 作者:行者123 更新时间:2023-11-30 22:48:21 25 4
gpt4 key购买 nike

我在 WPF 中构建了几个用户控件,它们都被添加到 Canvas 中。我想添加一个行为来跟踪当前选定的用户控件。在以下情况下应选择用户控件:

  1. 鼠标点击它;
  2. 当它获得焦点时;
  3. 当上述两种情况之一发生在用户控件的子控件上时。

有什么方法可以纯粹通过使用 WPF 的焦点机制来处理这个问题,还是我需要在焦点类的帮助下自己处理这个问题?

我已经阅读了 WPF 中处理焦点的新方法,我面临的问题是键盘焦点决定了当前选定的对象是什么,但我的控件的某些部分无法接收键盘焦点,因此即使单击这些部分,用户控件也不会获得焦点。

我正在寻求有关如何实现此功能以及我可以/应该在多大程度上依赖焦点机制的建议。最终,如果只能选择一个对象,我不会介意,但如果它可以轻松扩展为多选,那么我也不会介意。

澄清一下,我知道我可以通过处理大量事件和跟踪状态来手动构建它,但我只是希望有一种更简单的方法可用。

最佳答案

UIElement.IsKeyboardFocusWithinPreviewMouseDown 处理程序相结合:

  1. 调用 PreviewMouseDown 时,在 DispatcherPriority.Input 处使用 Dispatcher.BeginInvoke 设置标志并安排回调以将焦点设置到UserControl(如果该标志仍处于设置状态)。

  2. 为 UserControl 中的 UIElement.IsKeyboardFocusWithin 属性更改设置处理程序。当处理程序触发时,清除标志。

这里的想法是,如果您单击 UserControl 上的任意位置并且键盘焦点不会导致焦点移到 UserControl 中,则强制它移到 UserControl 中。

仅供引用,步骤 1 在代码中大致如下所示:

public override OnPreviewMouseDown(MouseButtonEventArgs e)
{
_mouseClickedButNoFocus = true;
Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
if(_mouseClickedButNoFocus)
Focus();
});
}

关于c# - 在 WPF 中处理 GUI 上的选定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com