2016-04-07 13 views
2

スライダを使用してビデオの位置を制御する必要があります(別の場合はドキュメントページ)。しかし、問題は、スライダーの値がユーザーによって変更されたかどうか(クリック、サムドラッグ...)、またはバインディングから判断する方法がわかりません。バインダーからではなく、UIからスライダー値が更新されたときにのみ、何らかのイベントを発生させることは可能ですか?WPFスライダ - 値がUIから変更されたときに通知

私は、カスタムスライダーを実装しました:

public class NotifyingSlider : Slider 
{ 

    public static readonly DependencyProperty ValueChangedFromUIProperty = 
     DependencyProperty.Register("ValueChangedFromUI", typeof(ICommand), typeof(NotifyingSlider)); 

    public ICommand ValueChangedFromUI 
    { 
     get 
     { 
      return (ICommand)GetValue(ValueChangedFromUIProperty); 
     } 
     set 
     { 
      SetValue(ValueChangedFromUIProperty, value); 
     } 
    } 

    protected override void OnThumbDragCompleted(DragCompletedEventArgs e) 
    { 
     base.OnThumbDragCompleted(e); 
     ValueChangedFromUI?.Execute(null); 
    } 

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonUp(e); 
     ValueChangedFromUI?.Execute(null); 
    } 
} 

しかしValueChangedFromUIコマンドは、ユーザが特定の位置に親指をドラッグするか、正確に目盛りの位置にバーをクリックしたときにのみ実行されます。ユーザーが2つのティックの間をクリックすると(値/サムが近くに移動する)、コマンドは実行されません - これは私の主な問題です。

答えて

2

残念ながら、私はこれを行う簡単な方法はないと思います。私がやる方法は、単に値をバインドしないで、ValueChangedイベントをスライダーに追加するだけです。次に、スライダが視覚的に変更されたときに何かをする必要がある場合、ValueChangedで何かが発生します。また、このイベントで(バインドされていない)値を含むプロパティを更新することもできます。これにより、スライダの値とバインドする必要がある値は常に同じになり、変更された内容に応じて異なるアクションを指定することができます。

追加のフラグ(bool IgnoreUpdate)を指定できます。このフラグは、バインドされていないプロパティを更新するときにtrueに設定できます。

次に、バインドされていないプロパティを直接更新する場合は、実際のスライダ値をIgnoreUpdateをチェックするメソッドで更新します。 IgnoreUpdateがtrueの場合、バインドされていないプロパティを更新しないでください(これは無限ループになります)、次の値の変更時にfalseに戻します。偽であれば、スライダを視覚的に変更し、この変更を気にするプロパティ(バインドされていないプロパティ)に反映するため、スライダを更新します。

private bool IgnoreUpdate = false; 

private int value = 0; 
public int Value 
{ 
    get 
    { 
     return this.value; 
    } set 
    { 
     this.value = value; 
     this.IgnoreUpdate = true; 
     this.UpdateValue(value); 
    } 
} 

public void UpdateValue(int ProgressValue) 
{ 
    this.Slider.Value = ProgressValue; 
    if (IgnoreUpdate) 
    { 
     IgnoreUpdate = false; 
     return; 
    } 
    //Do stuff when the value changes visually 
    this.Value = ProgressValue; 
} 

private void Slider_ValueChanged(object sender, ProgessChangedEventArgs e) 
{ 
    this.UpdateValue(e.Value); 
} 

とにかくこのようにしたい理由はわかりませんが、これは私が考案できる最も先進的なアプローチです。

関連する問題