2011-05-30 92 views
1

我正在使用滑块来显示正在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; 
    } 
} 
+1

我们需要查看相关代码才能提供帮助。例如,你如何移动拇指?它是标准的Slider控件还是您制作的自定义控件? – 2011-05-30 12:47:59

+0

有没有人遇到过这个问题? – lupedito 2011-06-04 18:11:40

+0

我可以重现这个问题。即使没有媒体元素(只需创建一个滑块并有一个计时器以每N ms递增一次)。如果递增完整整数比双打增加,问题就不那么明显了,但它肯定存在。 – 2011-06-14 06:16:13

回答

0

拇指如何绘制肯定存在问题。在Windows 7/64下运行时,滑块的大拇指移动很可怕。拇指是用花哨的Aero模式主题模块绘制的,所以在预感上,我发起了Blend并投入了“SimpleSlider”,这只是一个具有完全自定义风格和模板的常规。一旦我这样做,拇指开始移动非常顺利。

你可以走试试SimpleSlider风格的路线,或者从头开始自己的模板。