wpf滑块拇指在移动时改变大小
问题描述:
我正在使用滑块来显示正在mediaelement中播放的videofile的进度。我每200ms用一个定时器更新拇指的位置。我还用一个快速前进/快退按钮改变滑块的位置,改变媒体元素的位置。 问题是在播放媒体元素期间或使用向前/向后按钮时拇指的大小会发生变化。它变得更厚,然后再变薄,这是重复的。我该如何解决这个问题?wpf滑块拇指在移动时改变大小
这里我上传,显示拇指 http://v7.tinypic.com/player.swf?file=2mw6xhx&s=7
这里的奇怪行为的视频是代码:
滑块在XAML
<Slider Name="sliderPosition"
Width="220"
Margin="2"
ValueChanged="sliderPosition_ValueChanged"
Thumb.DragStarted="sliderPosition_DragStarted"
Thumb.DragCompleted="sliderPosition_DragCompleted" />
代码背后
//initialization
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(200);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
private void OnMediaOpened(object sender, RoutedEventArgs e)
{
if (MediaElem.NaturalDuration.HasTimeSpan)
{
TimeSpan ts = TimeSpan.FromMilliseconds(MediaElem.NaturalDuration.TimeSpan.TotalMilliseconds * 0.95);
sliderPosition.Maximum = ts.TotalSeconds;
sliderPosition.SmallChange = 1;
sliderPosition.LargeChange = Math.Min(10, ts.Seconds/10);
tbPosition.Text = String.Format("00:00:00");
tbDuration.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
}
}
private void MoveForward(int millisec)
{
if ((MediaElem.Position.TotalMilliseconds + millisec) > (MediaElem.NaturalDuration.TimeSpan.TotalMilliseconds * 0.95))
{
MediaElem.Position = TimeSpan.FromMilliseconds(MediaElem.NaturalDuration.TimeSpan.TotalMilliseconds * 0.95);
}
else
{
MediaElem.Position = MediaElem.Position + TimeSpan.FromMilliseconds(millisec);
sliderPosition.Value = MediaElem.Position.TotalSeconds;
}
}
private void MoveBackward(int millisec)
{
if ((MediaElem.Position - TimeSpan.FromMilliseconds(millisec)) < TimeSpan.FromMilliseconds(0))
{
MediaElem.Position = TimeSpan.FromMilliseconds(0);
}
else
{
MediaElem.Position = MediaElem.Position - TimeSpan.FromMilliseconds(millisec);
sliderPosition.Value = MediaElem.Position.TotalSeconds;
}
}
private void sliderPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
TimeSpan ts = TimeSpan.FromSeconds(e.NewValue);
tbPosition.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
MediaElem.Position = ts;
}
private void sliderPosition_DragStarted(object sender, DragStartedEventArgs e)
{
isDragging = true;
}
private void sliderPosition_DragCompleted(object sender, DragCompletedEventArgs e)
{
isDragging = false;
MediaElem.Position = TimeSpan.FromSeconds(sliderPosition.Value);
}
void timer_Tick(object sender, EventArgs e)
{
if (!isDragging && isPlaying)
{
sliderPosition.Value = MediaElem.Position.TotalSeconds;
}
}
答
拇指如何绘制肯定存在问题。在Windows 7/64下运行时,滑块的大拇指移动很可怕。拇指是用花哨的Aero模式主题模块绘制的,所以在预感上,我发起了Blend并投入了“SimpleSlider”,这只是一个具有完全自定义风格和模板的常规。一旦我这样做,拇指开始移动非常顺利。
你可以走试试SimpleSlider风格的路线,或者从头开始自己的模板。
我们需要查看相关代码才能提供帮助。例如,你如何移动拇指?它是标准的Slider控件还是您制作的自定义控件? – 2011-05-30 12:47:59
有没有人遇到过这个问题? – lupedito 2011-06-04 18:11:40
我可以重现这个问题。即使没有媒体元素(只需创建一个滑块并有一个计时器以每N ms递增一次)。如果递增完整整数比双打增加,问题就不那么明显了,但它肯定存在。 – 2011-06-14 06:16:13