繁体   English   中英

如何更改自定义控件 IsMouseOver 的属性值

[英]How do I change the property value of a custom control IsMouseOver

  • 我创建自定义框架元素( notifyicon )。

  • 我正在听 windows 消息回调。

  • 我希望 Onmouseenter 更改 ismouseover,但 ismouseover 是 RegisterReadOnly。

  • 我无法改变

     private IntPtr CallBack(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam) { if (IsLoaded) { var wm = lparam.ToInt32(); switch (wm) { case WM.LBUTTONDBLCLK: OnMouseDoubleClick(); break; case WM.LBUTTONDOWN: OnMouseDown(MouseButton.Left); break; case WM.LBUTTONUP: OnMouseUp(MouseButton.Left); break; case WM.RBUTTONDOWN: OnMouseDown(MouseButton.Right); break; case WM.RBUTTONUP: OnMouseUp(MouseButton.Right); break; case WM.MOUSEMOVE: OnMouseEnter(); OnMouseMove(); break; } } return User32.DefWindowProc(hwnd, msg, wparam, lparam); } private void OnMouseEnter() { IsMouseOver = true;// cannot changed }

你没有。 正如文档所述,您不应该这样做:

WPF 框架中定义的一些依赖属性是只读的。 指定只读依赖属性的典型原因是这些属性应该用于 state 确定,但 state 受多种因素影响,但仅将属性设置为 Z9ED39E2EA931586B6EZ985A6 是不可取的。用户界面设计视角。 例如,属性 IsMouseOver 实际上只是根据鼠标输入确定 state 表面。 通过规避真正的鼠标输入以编程方式设置此值的任何尝试都是不可预测的,并且会导致不一致。

可以使用反射设置依赖属性

DependencyPropertyKey key = (DependencyPropertyKey)typeof(UIElement).GetField("IsMouseOverPropertyKey",
               BindingFlags.NonPublic | BindingFlags.Static).GetValue(this);

SetValue(key, true);

然而,这不会影响IsMouseOver CLR 属性,该属性从内部标志字段而不是依赖属性获取其值:

public bool IsMouseOver
{
    get
    {
        return ReadFlag(CoreFlags.IsMouseOverCache);
    }
}

因此,如果要自定义检测鼠标是否在您的控件上方的方式,您最好创建自己的属性,您可以根据需要设置该属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM