1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// quelque using ;-)
namespace VideoControlLib
{
/// <summary>
/// Interaction logic for TimelineControl.xaml
/// </summary>
public partial class TimelineControl :
System.Windows.Controls.UserControl
{
//-------------------------------------------------------------------------
#region Dependency properties
public static readonly DependencyProperty PositionProperty =
DependencyProperty.Register(
"Position",
typeof(double),
typeof(TimelineControl),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnPositionChanged)));
public double Position
{
get { return (double)GetValue(TimelineControl.PositionProperty); }
set { SetValue(TimelineControl.PositionProperty, (double)value); }
}
private static void OnPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TimelineControl ptc = (TimelineControl)d;
if (ptc.m_isMouseDown)
{
// Seeking
// la valeur du slider est un pourcentage, pour avoir la véritable valeur
// il faut la calculer
double position = ptc.Position * ptc.m_model.Max;
ptc.m_model.Position = position;
}
}
#endregion
public TimelineControl()
{
InitializeComponent();
m_timer.Tick += new EventHandler(OnTickEvent);
m_timer.Interval = TimeSpan.FromMilliseconds(50);
// permet de récupérer les event meme si slider les a déjà traités
m_slider.AddHandler(Slider.PreviewMouseDownEvent, new MouseButtonEventHandler(this.OnPreviewMouseDown), true);
m_slider.AddHandler(Slider.PreviewMouseUpEvent, new MouseButtonEventHandler(this.OnPreviewMouseUp), true);
}
public void Initialize(IModel model)
{
m_model = model;
DataContext = m_model;
m_model.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(OnPropertyChanged);
}
//-------------------------------------------------------------------------
#region Private callback
private void OnTickEvent(object sender, EventArgs e)
{
if (m_timelineVM.PlayRangeOut.ReferenceTime == 0)
return;
// la position du slider est un pourcentage...
//update position
Position = m_model.Position / m_model.Max;
}
private void OnPropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsPlayheadMoving")
{
if (m_model.IsPlayheadMoving)
{
m_timer.Start();
}
else
{
m_timer.Stop();
}
}
if (e.PropertyName == "TransportState")
{
if( m_model.TransportState == TransportState.Stopped)
{
Position = 0.0;
}
else if (m_model.TransportState == TransportState.Paused)
{
// la position du slider est un pourcentage...
//update position
Position = m_model.Position / m_model.Max;
}
}
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
m_isMouseDown = true;
// permet de placer le thumb lors du clic
// la valeur du slider est un pourcentage, pour avoir la véritable valeur
// il faut la calculer
double position = ptc.Position * ptc.m_model.Max;
ptc.m_model.Position = position;
}
private void OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
{
m_isMouseDown = false;
}
#endregion
//-------------------------------------------------------------------------
#region Private members
private System.Windows.Threading.DispatcherTimer m_timer =
new System.Windows.Threading.DispatcherTimer();
private ViewModels.PlayerLib.ITimelineViewModel m_timelineVM;
private ViewModels.PlayerLib.ITransportBasicViewModel m_transportVM;
private bool m_isMouseDown = false;
#endregion
}
} |
Partager