Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改自定义控件IsMouseOver的属性值_C#_Wpf - Fatal编程技术网

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

C# 如何更改自定义控件IsMouseOver的属性值,c#,wpf,C#,Wpf,我创建自定义框架元素(notifyicon) 我正在侦听windows消息回调 我想把onmouseinter改成ismouseover,但ismouseover是 注册表只读 我不能改变 private IntPtr CallBack(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam) { if (IsLoaded) { var wm = lparam.ToInt32(); s

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

  • 我正在侦听windows消息回调

  • 我想把onmouseinter改成ismouseover,但ismouseover是 注册表只读

  • 我不能改变

     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框架中定义的某些依赖项属性是只读的。指定只读依赖项属性的典型原因是,这些属性应用于状态确定,但该状态受多种因素影响,但从用户界面设计的角度来看,仅将属性设置为该状态是不可取的。例如,属性IsMouseOver实际上只是根据鼠标输入确定的表面状态。任何通过绕过真实鼠标输入以编程方式设置此值的尝试都是不可预测的,并且会导致不一致

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

      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);
          }
      }
      

      因此,如果要自定义检测鼠标是否位于控件上方的方法,最好创建自己的属性,可以根据需要进行设置。

      消息回调可能不在UI线程上。您是否尝试使用Dispatcher在OnMouseCenter中进行提升?