【问题标题】:Making Things Under Canvas Not Receive Events使 Canvas 下的东西不接收事件
【发布时间】:2017-02-27 09:34:56
【问题描述】:

我正在使用 Visual C# 2015 开发 WPF 项目。

我在Canvas 下方有一个Button。我想让Canvas 捕获所有鼠标事件,这样只要Canvas 在前面,Button 就不会收到任何这些事件。如果可能的话,我还想阻止Button 接收用户输入生成的任何事件,例如KeyDownMouseMove

我该如何做到这一点?

【问题讨论】:

  • 题外话:为什么Button 下方有Canvas
  • 当您不希望它接收输入时,您是否有理由不只是禁用该按钮?
  • @KevinWallis 因为我想在上面渲染东西。我正在尝试构建一个基本的 GUI 编辑器。
  • @Lithium 因为如果我这样做,它的呈现方式就会不同。
  • 按钮是驻留在画布内部还是与画布位于同一面板中?为什么你不能发布你的标记?

标签: c# wpf user-interface events


【解决方案1】:

如果你想停止事件传播,你可以使用:

private void CanvasEvent(object sender, RoutedEventArgs e)
{
    // Draw/Move stuff
    ...
    e.Handled = true;   
}

在您的事件处理程序中。另一种方法是disableButton 或仅在使用时添加它。第三种方法可能是添加 bool 标志,例如isDrawing 并在您的 Button 事件处理程序中检查标志。

private void CanvasEvent(object sender, RoutedEventArgs e)
{
    // When drawing etc. starts, where the button should not handle the events
    isDrawing = true;  
}

private void ButtonEvent(object sender, RoutedEventArgs e)
{
    if (isDrawing) { return; }
    // When not drawing do stuff
    ...
}

我更喜欢e.Handled = true; 方法。 必须为 Canvas 显式设置 Background,否则它不可命中测试(请参阅:WPF: Canvas Events Not working)。

【讨论】:

  • 不幸的是,e.Handled = true 在这种情况下不会停止传播,isDrawing 方法仍然会留下点击动画,而禁用按钮会导致其呈现不同。
  • @MaxRied 为什么e.Handled = true 不停止传播?
  • buttoncanvas 下面。 button.MouseMove: MessageBox.Show("MouseMove"); canvas.MouseMove: e.Handled = true; 当我移动光标时,出现MessageBox...
  • 尝试将e.Handled = true 添加到canvas PreviewMouseMove,因为MouseMove 事件在冒泡时使用,但您需要隧道事件。
  • 恐怕这没什么区别:buttoncanvas 下面。 button.MouseMove: MessageBox.Show("MouseMove"); canvas.PreviewMouseMove: e.Handled = true; 当我移动光标时,MessageBox 仍然出现。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多