2017-05-27 12 views
1

私は、キーを押すと(シフトを言うことができる)、その親指(およびその値)がマウスよりも遅くドラッグされ、より正確になるというスライダコントロールを作りたいと思います。より正確なスライダーコントロールを作成するには?

私はまだWPFを使い始めていません。

ヒント

EDIT ---ここ

は、私は水平スライダーで、これまでにしようとしているものです:

Point pStart; 
    Point pCurrent; 

    private void CMiXSlider_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     if (Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      pCurrent = Mouse.GetPosition(CMiXSlider); 
      double center = Math.Abs(pCurrent.X - pStart.X); 
      Value = (1.0/CMiXSlider.ActualWidth) * center; 
     } 
    } 

    private void CMiXSlider_DragStarted(object sender, DragStartedEventArgs e) 
    { 
      pStart = Mouse.GetPosition(CMiXSlider); 
    } 

ことが予想されるほとんどのように動作しますが、親指が0とpCurrent間の中心位置に常にあります。 DragDeltaがトリガーされたときにpStartがその値を保持しないように見えます。

答えて

2

これは主にUXの質問であり、副次的なのはWPFの質問だけです。私はWPFであなたを助けることはできませんが、私はUXの観点からあなたに何らかのインプットを与えることができます。

しないでください。

これを行わないでください。多くの理由から、悪い考えです。

a)非常に非標準です。私が今までに聞いたことのないアプリケーションは、そのようなことをしません。したがって、誰もあなたのスライダーがいくつかの修飾キーが押されたときに異なって動作することを誰も知らず、修飾キーを押したままスライダーをドラッグしようとすることはありません。

b)ユーザーに教えることはできません。何十年も前に実践されているように、それを使用する方法に関する指示を含む追加のテキストラベルを使用してユーザーインターフェイスを混乱させることは、厄介であり放棄されています。

c)何らかの形でユーザーに教えることができたとしても、既存の使い慣れたコントロールを使用する新しい方法を学習するという精神的な努力は、単純にその精度をスライダー。

d)これは、スライダをポインタの移動量の一部分だけ移動するか、ポインタを減速させることで動作します。

  • ポインタが動く距離のほんの少しだけスライダを動かすと、醜く見苦しくなります。それはうまくいくが、壊れて見えるだろう。

  • ポインタを遅くすることは難しい命題であり、はマウスでのみ機能します。ユーザーが指を使用するタッチインターフェイスはどうですか?あなたはそれを減速することはできません。

ソリューション:

  1. は、矢印キーによる移動を実装します。これは、スライダの値を細かく制御できる標準的な方法です。スライダにフォーカスがあると、矢印キーは値を1単位だけ変更する必要があります。

  2. アプリケーションの性質が高精度であることが重要な場合は、スライダを数値コントロールで置き換えることを検討してください。必要に応じてスピナーにしてください。(上下のボタンを備えた数値コントロール)または、ドロップダウンスライダーで数値コントロールにすることができます。そのため、主な操作方法は数値で、スライダによる操作は補助的でオプションです。 (私は考えているかもあなたがWPFでそれを行うことができます。)

+0

あなたは全く正しいですが、私の場合、私は、この機能を必要とします。私は細かい位置を必要とし、UI上でたくさんクリックすることは、細かい配置のための解決策ではありません。 – lecloneur

0

時には、この機能は、例えば、照明/オーディオコントロールやロボットアームの微細な位置決め、便利です。これらのUXの状況では、ユーザーはおそらくRTFMによって見つかるでしょう。

私はPCの前ではなく、Shiftキーが押されているときに2番目の値の変更を無視するカスタムスライダコントロールでそれを行う方法を示す簡単な擬似コードを示します。

public class CustomSlider : Slider 
{ 
    private int precision = 2; 
    private int movement = 0; 
    protected override void OnValueChanged(double oldValue, double newValue) 
    { 
    bool keyShift = (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) 

    if (keyShift && movement % precision == 0) 
    { 
     base.OnValueChanged(oldValue, newValue); 
    } 
    else if (!keyShift) 
    { 
     base.OnValueChanged(oldValue, newValue); 
    } 

    movement++; 
    if (movement == int.MaxValue) movement = 0; 
} 
} 

この解決方法は、数値の上/下、スクロールバーなどのさまざまなコントロールに適用できます。上記のコードに加えて

、あなたがOnValueChangedイベントでCtrlキーを検出し、精度を向上させることができ、より正確な相互作用のために、例えば

precision = Keyboard.IsKeyDown(Key.Control) ? 3 : 2; 
+0

こんにちは、OnValueChanged関数は何ですか? – lecloneur

+0

Sliderクラスの基本メソッド 'OnValueChange'をオーバーライドするメソッドです。 –

+0

あなたのケースにカスタムスライダを作成する必要があります。私は既にusercontrolから継承しているので、私はSliderから継承することはできません。 – lecloneur

関連する問題