c# - WPF如何在按下Shift键时更慢地移动滑块拇指
问题描述
我有一个滑块,当我按下 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?
}
}
解决方案
我写了一个假滑块来实现你的目标。我不使用本机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;
}
推荐阅读
- firebase - 如何协调数组创建与数组附加?
- javascript - 如何阻止函数在使用 Jquery 制作的计算器中运行
- assembly - x86 中调试寄存器的使用
- c# - 如果条件在 Jquery 中不起作用,为什么要使用 ViewBag?
- proxy - java webstart 应用程序 (jnlp) 的 SOCKs 代理设置
- php - 如何解决与 Jenssegers/Mongodb 相关的 Lumen 错误?
- node.js - Heroku 部署错误不允许 Discord.js 机器人在线出现 [NPM_CONFIG_LOGLEVEL=error]
- swift - AVAssetExportSession.exportAsynchronously 没有取得进展
- node.js - nodejs 编写一个程序,在指定时间执行对 HTTP 端点的调用
- python - 什么是仅读取文本文件中的完整单词的python代码(词法分析仅检测整个单词)?