17

我试过这个 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 时,如何让此代码工作?

4

4 回答 4

19

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

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

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

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

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

于 2008-10-03T21:09:30.310 回答
18

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

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

于 2008-10-02T05:43:40.417 回答
5

尝试使用 LostMouseCapture 和 GotMouseCapture。

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

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

于 2015-01-15T00:24:52.583 回答
1

我想提一下 Slider 并没有完全吞下整个 MouseDown 事件。通过单击刻度线,您可以获得事件通知。Slider 不会处理 MouseDown 事件,除非它们来自滑块的...滑块。

基本上,如果您决定使用

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

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

于 2012-06-09T04:31:23.717 回答