WPF как двигать ползунок медленнее при нажатии клавиши Shift - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть ползунок, который я хочу, чтобы большой палец перемещался в точное положение при нажатии в любом месте на дорожке ползунка, и двигался медленнее, когда я нажимал клавишу 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?
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

The Preview

Я написал фальшивый слайдер для достижения вашей цели.Я не использую нативный 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...