小编Ael*_*anY的帖子

如何确定是否通过鼠标或键选择?

我有一个MVVM应用程序,在窗口的左侧有一个WPF TreeView.右侧的详细信息面板根据所选的树节点更改内容.

如果用户选择节点,则详细信息面板的内容会立即更改.如果用户点击该节点,则需要这样做,但如果用户使用键向下/向上导航树,我想延迟更改内容.(与Windows资源管理器的行为相同,至少在Win XP下)我假设我必须在我的ViewModel中知道是否通过鼠标或键盘选择了节点.

我怎样才能做到这一点?

更新:

这是我的第一篇文章,因此我不确定这是不是正确的地方,但我想让社区知道我在此期间做了什么.这是我自己的解决方案.我不是专家,所以我不知道这是不是一个好的解决方案.但它适用于我,如果能帮助别人,我会很高兴.错误修正,改进或更好的解决方案非常受欢迎.

我创建了下面附加的属性HasMouseFocus ...
(首先我使用了MouseEnterEvent但是如果用户使用键向上/向下导航树并且鼠标指针随机遍布任何导航的树项目,这不能很好地工作,因为在这种情况下详细信息立即更新.)

public static bool GetHasMouseFocus(TreeViewItem treeViewItem)
{
  return (bool)treeViewItem.GetValue(HasMouseFocusProperty);
}

public static void SetHasMouseFocus(TreeViewItem treeViewItem, bool value)
{
  treeViewItem.SetValue(HasMouseFocusProperty, value);
}

public static readonly DependencyProperty HasMouseFocusProperty =
  DependencyProperty.RegisterAttached(
    "HasMouseFocus",
    typeof(bool),
    typeof(TreeViewItemProperties),
    new UIPropertyMetadata(false, OnHasMouseFocusChanged)
  );

static void OnHasMouseFocusChanged(
  DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
  TreeViewItem item = depObj as TreeViewItem;
  if (item == null)
    return;

  if (e.NewValue is bool == false)
    return;

  if ((bool)e.NewValue)
  {
    item.MouseDown += OnMouseDown;
    item.MouseLeave += OnMouseLeave; …
Run Code Online (Sandbox Code Playgroud)

c# wpf .net-4.0 mvvm treeviewitem

8
推荐指数
1
解决办法
620
查看次数

标签 统计

.net-4.0 ×1

c# ×1

mvvm ×1

treeviewitem ×1

wpf ×1