4

我想将鼠标单击发送到控件后面的应用程序。我有一个最顶层的透明窗口和一些控件。我希望能够通过其中一些控件发送点击。

我已经尝试将属性 IsHitTestVisible="False" 设置为控件,但它不起作用。例如,它不会通过控件将点击发送到桌面。

我也尝试过这个问题中提出的解决方案:如何在 WPF 中创建一个允许鼠标事件通过的半透明窗口

它可以工作,但我想让一些控件透明,而不是窗口。

如何将该问题的解决方案应用于单个控件,例如椭圆?

解决方案:

public static class WindowsServices
{
  const int WS_EX_TRANSPARENT = 0x00000020;
  const int GWL_EXSTYLE = (-20);

  [DllImport("user32.dll")]
  static extern int GetWindowLong(IntPtr hwnd, int index);

  [DllImport("user32.dll")]
  static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

  public static void SetWindowExTransparent(IntPtr hwnd)
  {
    var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
  }
}

protected override void OnSourceInitialized(EventArgs e)
{
  base.OnSourceInitialized(e);
  var hwnd = new WindowInteropHelper(this).Handle;
  WindowsServices.SetWindowExTransparent(hwnd);
}
4

1 回答 1

0

以这种方式使用路由事件。在控件 A 中写入点击事件:

 #region - Routed events -
    /// <summary>
    /// Bubble event
    /// </summary>
    public static readonly RoutedEvent ClickEvent =
        EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof([Class name]));
    public event RoutedEventHandler Click
    {
        add { AddHandler(ClickEvent, value); }
        remove { RemoveHandler(ClickEvent, value); }
    }

    /// <summary>
    /// Fired the click event
    /// </summary>
    /// <param name="sender">this control</param>
    /// <param name="e">routed args</param>
    private void usercontrol_Clicked(object sender, RoutedEventArgs e)
    {
        RoutedEventArgs args = new RoutedEventArgs(LastUnitCycleTime.ClickEvent);
        RaiseEvent(args);
    }
    #endregion - Routed events -

那么您可以在所有其他控件中使用它,只需使用以下方式:

在其他控件构造函数中插入这一行:在本例中为 usercontrol2

usercontrol_Clicked += usercontrol2Name_Clicked;

那么这是在您单击 control1 时触发 control2 中的方法

  private void usercontrol2Name_Clicked(object sender, RoutedEventArgs e)
    {          
        //effort here what you want....
    }
于 2022-02-23T09:46:05.820 回答