【问题标题】:WPF: Slider doesnt raise MouseLeftButtonDown or MouseLeftButtonUpWPF:滑块不会引发 MouseLeftButtonDown 或 MouseLeftButtonUp
【发布时间】:2010-09-14 17:31:22
【问题描述】:

我试过这个 XAML:

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" />

还有这个 C#:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = true;
}

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = false;
}

sliderMouseDown 变量永远不会改变,因为永远不会引发 MouseLeftButtonDown 和 MouseLeftButtonUp 事件。当用户在滑块上按下鼠标左键以将 bool 值设置为 true 并且当鼠标向上时 bool 设置为 false 时,如何让此代码工作?

【问题讨论】:

    标签: c# wpf slider mouseevent


    【解决方案1】:

    另一种方法(根据您的情况可能更好)是在过程代码中注册一个事件处理程序,如下所示:

    this.AddHandler
    (
        Slider.MouseLeftButtonDownEvent,
        new MouseButtonEventHandler(slider_MouseLeftButtonDown),
        true
    );
    

    请注意真正的论点。 它基本上表示您希望接收该事件,即使它已被标记为已处理。不幸的是,像这样连接事件处理程序只能通过过程代码完成,而不能通过 xaml 完成。

    换句话说,使用此方法,您可以为普通事件(冒泡)注册一个事件处理程序,而不是为隧道(因此在不同时间发生)的预览事件注册一个事件处理程序。

    有关详细信息,请参阅 WPF Unleashed 第 70 页的 Digging Deeper 侧边栏。

    【讨论】:

    • 使用这个技巧似乎会让你(或其他人)的工作在未来变得更加困难。这真的是个好主意吗?
    • 我不会称其为 hack。但是,话虽如此,如果可能的话,我会尽量避免使用它,但如果你在岩石和坚硬的地方之间......让我解释一下。预览事件在常规事件之前触发。因此,在当前情况下使用预览事件可能并不总是有效。
    • 这是使 Wpf 在 MFC 应用程序中工作的“唯一”方式。预览事件会干扰我们在应用程序中的消息传递。
    • 感谢您的解决方案。我遇到了同样的问题,你的回答解决了。
    • Corey...不敢相信我忘了提到 HandledEventsToo,这是一种替代方案,根据给定的场景(例如,如果你想短路事件并在更高级别处理它,您可以在预览事件中将事件的handled属性设置为true(防止它在大多数情况下被较低的元素触发)。
    【解决方案2】:

    滑块吞下 MouseDown 事件(类似于按钮)。

    您可以注册 PreviewMouseDown 和 PreviewMouseUp 事件,这些事件在滑块有机会处理它们之前被触发。

    【讨论】:

    • 谢谢,我能够结合使用 IsMouseCapturedWithinChanged 事件和 PreviewMouseLeftButtonUp 事件来实现我的最终目标。
    • 有人知道这种行为的原因吗?
    • 出现这种行为的原因是按钮处理了 MouseDown 事件。默认情况下,如果任何控件声明他们已经处理了一个事件,那么除非他们指定他们也希望查看已处理的事件,否则其他人不会收到通知。
    【解决方案3】:

    尝试使用 LostMouseCapture 和 GotMouseCapture。

        private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)
    
        private void slider_GotMouseCapture(object sender, MouseEventArgs e)
    

    GotMouseCapture 在用户开始拖动滑块时触发,而 LostMouseCapture 在他释放时触发。

    【讨论】:

      【解决方案4】:

      我想提一下,Slider 并没有完全吞下整个 MouseDown 事件。通过点击一个勾号,您可以收到有关该事件的通知。 Slider 不会处理 MouseDown 事件,除非它们来自滑块的...滑块。

      基本上如果你决定使用

      AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)
      

      勾选打开的版本,请确保之前已处理过该事件。如果你不这样做,你最终会遇到一个边缘情况,你认为滑块被点击了,但它真的是一个勾号。注册预览活动更糟糕 - 您可以在任何地方获取活动,甚至在刻度之间的空白处。

      【讨论】:

        猜你喜欢
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多