スライダーのサムをスライダーをクリックした位置にジャンプさせる方法を知りたかったのです。つまり、ユーザーがスライダーをクリックした場所の値を取得するにはどうすればよいですか (そして、スライダーの値を設定できます)。
この質問は次のようなものです。
Move-To-Position 動作を備えたスライダー コントロール
しかし、利用可能な解決策はありません。
wp7 のスライダー コントロールにはIsMoveToPointEnabledプロパティがないため、関数 IMO を取得するにはカスタマイズが唯一の方法です。次のコードを使用します。
public class CustomSlider: Slider {
public CustomSlider() {
DefaultStyleKey = typeof (Slider);
}
public override void OnApplyTemplate() {
base.OnApplyTemplate();
RepeatButton rb;
rb = base.GetTemplateChild("HorizontalTrackLargeChangeIncreaseRepeatButton") as RepeatButton;
rb.MouseMove += new MouseEventHandler(rb_MouseMove);
rb.Click += new RoutedEventHandler(rb_Click);
rb = base.GetTemplateChild("HorizontalTrackLargeChangeDecreaseRepeatButton") as RepeatButton;
rb.MouseMove += new MouseEventHandler(rb_MouseMove);
rb.Click += new RoutedEventHandler(rb_Click);
rb = base.GetTemplateChild("VerticalTrackLargeChangeIncreaseRepeatButton") as RepeatButton;
rb.Click += new RoutedEventHandler(rb_Click);
rb.MouseMove += new MouseEventHandler(rb_MouseMove);
rb = base.GetTemplateChild("VerticalTrackLargeChangeDecreaseRepeatButton") as RepeatButton;
rb.Click += new RoutedEventHandler(rb_Click);
rb.MouseMove += new MouseEventHandler(rb_MouseMove);
//rb.
}
Point ps;
void rb_MouseMove(object sender, MouseEventArgs e) {
ps = e.GetPosition(this);
}
public event EventHandler MyClickEvent;
void rb_Click(object sender, RoutedEventArgs e) {
if (MyClickEvent != null) MyClickEvent(this, new PositionEventArgs(ps));
}
}
public class PositionEventArgs: EventArgs {
public Point Position {
set;
get;
}
public PositionEventArgs() {}
public PositionEventArgs(Point p) {
Position = p;
}
}
私は最善を尽くしますが、今までうまくいきませんでした。xaml でRepeatButtonが単独の場合でも、スライダーに埋め込まれたRepeatButtonのMOUSEOVERイベントは発生しません。実際、私の実験ではCLICKイベントだけが発生します。
ほとんどのビデオ プレーヤーにこの機能があるので、自分のプレーヤーでそれを作成する方法を本当に知りたいです。