【问题标题】:WPF how to move a slider thumb slower when shift key is pressedWPF如何在按下shift键时更慢地移动滑块
【发布时间】:2019-07-21 11:44:02
【问题描述】:

我有一个滑块,我希望在单击滑块轨道上的任意位置时,拇指移动到准确的位置,当我按下 Shift 键并拖动拇指时,它的移动速度较慢。我知道如何检测何时按下 shift 键,但我不知道如何减慢拇指的速度。任何帮助将不胜感激!

这里是 xaml 代码:

<Grid>
    <Slider x:Name="m_Slider" IsMoveToPointEnabled="True" Orientation="Vertical" 
            Height="200" Width="30" Minimum="0" Maximum="20" HorizontalAlignment="Center" 
            Thumb.DragStarted="Slider_ShiftDrag"/>
</Grid>

这里是代码隐藏:

void Slider_ShiftDrag(object sender, DragStartedEventArgs e)
{
    if (e != null && (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)))
    {
        //What should I do here?
    }
}

【问题讨论】:

  • 我很确定拖动只会将拇指移动到光标所在的位置。您必须减慢光标的移动速度或重新发明滑块的工作方式。
  • 你最好创建一个带有隐形拇指的假滑块。

标签: c# wpf xaml


【解决方案1】:

我写了一个假滑块来实现你的目标。我不使用本机Thumb,因为本机捕获鼠标并始终跟随鼠标。所以我写了一个Rectangle 而不是Thumb 来进行拖动。

这是 XAML:

<Grid Width="400" Height="32">
    <Rectangle x:Name="Tracker" Height="2" Fill="Gray" />
    <Rectangle x:Name="Thumb" Width="8" Height="32" Margin="-4 -16" Fill="DarkGray" HorizontalAlignment="Left" VerticalAlignment="Center"
               MouseDown="Thumb_MouseDown" MouseMove="Thumb_MouseMove" MouseUp="Thumb_MouseUp" LostMouseCapture="Thumb_LostMouseCapture">
        <UIElement.RenderTransform>
            <TranslateTransform x:Name="ThumbTranslation" />
        </UIElement.RenderTransform>
    </Rectangle>
</Grid>

这是代码隐藏:

private Point? _lastPoint;

private void Thumb_MouseDown(object sender, MouseButtonEventArgs e)
{
    _lastPoint = e.GetPosition(Tracker);
    Thumb.CaptureMouse();
}

private void Thumb_MouseMove(object sender, MouseEventArgs e)
{
    if (_lastPoint != null)
    {
        var currentPoint = e.GetPosition(Tracker);
        var offset = currentPoint - _lastPoint.Value;
        _lastPoint = currentPoint;
        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
        {
            offset *= 0.2;
        }
        SetThumbTranslation(offset.X);
    }
}

private void Thumb_MouseUp(object sender, MouseButtonEventArgs e)
{
    _lastPoint = null;
    Thumb.ReleaseMouseCapture();
}

private void Thumb_LostMouseCapture(object sender, MouseEventArgs e)
{
    _lastPoint = null;
}

private void SetThumbTranslation(double offsetX)
{
    var x = ThumbTranslation.X + offsetX;
    x = Math.Max(x, 0);
    x = Math.Min(x, Tracker.ActualWidth);
    ThumbTranslation.X = x;
}

【讨论】:

  • 这是降低光标速度的好方法,但是如何将光标移动到我点击的确切位置,这由原始 xaml 代码 IsMoveToPointEnabled="True" 完成?
  • 没关系,我发现添加一个新的 MouseDown 事件可以轻松解决这个问题。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多