WPF 滑块仅可拖动

Posted

技术标签:

【中文标题】WPF 滑块仅可拖动【英文标题】:WPF Slider Draggable Only 【发布时间】:2016-07-02 13:31:31 【问题描述】:

我有一个奇怪的要求,即让 WPF 应用程序中的滑块只能拖动,这意味着单击滑块轨道不应移动滑块,它只应在用户单击并拖动拇指时移动。有没有办法在 WPF 中实现这一点?我看到一个帖子建议你从 Slider 派生一个自定义控件,但是只有 4 个虚拟方法,而且似乎没有帮助。

这是我现在的滑块定义。

<Slider Name="radialSlider" 
        Width="150"  
        VerticalAlignment="Center" 
        TickFrequency=".005" 
        Minimum="-.25" 
        Maximum=".25" 
        IsSnapToTickEnabled="True" 
        ValueChanged="radialSlider_ValueChanged" 
        Thumb.DragCompleted="radialSlider_DragCompleted"  
        Grid.Column="1">
</Slider>

【问题讨论】:

我猜您正在使用 DragCompleted 事件来确保仅在拖动完成后才更新值。您可以在 Value Changed 事件中发布您在做什么吗?我想我有一个解决方案,但可能不得不操纵 【参考方案1】:

通过拦截径向滑块上的鼠标按下事件并检查鼠标是否位于拇指滑块上,我能够得到我认为的预期行为。你忘了提到你正在使用the Mahapps UI library。我使用了一个名为Snoop 的程序,它检查页面中的可视元素以查找 MetroThumb 控件的名称。 MetroThumb 元素只有在radialSlider 加载后才能找到,因此需要在radialSlider 的Loaded 事件触发后调用搜索方法。

MetroThumb mt;
loadPage()
    radialSlider.Loaded += (s, e) => 
        mt = radialSlider.FindChild<MetroThumb>("HorizontalThumb");
    ;
    radialSlider.PreviewMouseDown += md;


private void md(object sender, RoutedEventArgs e) 
    if (!mt.IsMouseOver) 
        e.Handled = true;
    

【讨论】:

以上是关于WPF 滑块仅可拖动的主要内容,如果未能解决你的问题,请参考以下文章

WPF:带有在用户拖动后触发的事件的滑块

WPF:具有在用户拖动后触发的事件的滑块

允许 Gridstack 仅可拖动到项目的特定区域

Google地图图块仅在触摸设备上触发dragend时加载

如何使用 SwiftUI 拖动工作滑块

iOS 自由拖动的滑块