1

作業中のプロジェクト用に WPF でゲージ コントロールを作成する必要があります。ゲージ制御とは、従来の車の速度計に似たものを意味します。円周に数字と目盛りが付いた円形の面と、現在の値を指す針です。雇用主にサードパーティ製のコントロールを購入してもらうか、どこかで無料のものを見つけてもらうこともできますが、何よりも好奇心のために、自分で書きたいと思っています。

私が最初に考えたのは、テンプレートを使用して既存のコントロールを「スキン」することでした。たとえば、Minimum、Maximum、および Value プロパティを持つ ProgressBar のようなものです。ただし、これで必要な柔軟性が得られるとは思いません。

現在の値を指す針をアニメーション化して、ゲージの値が変化したときに針が古い値から新しい値に移動するようにしたいと思います。これを行う最も簡単な方法は、針を表す何らかの形状またはジオメトリを用意し、関連する度数の RotateTransform を適用して、針が正しい値を指すようにすることだと考えました。アニメーションの To プロパティは、バインディングを介して「値度」プロパティに設定されます。

私が取ることができる3つの基本的なアプローチがあるように私には思えます:

1 つのカスタム FrameworkElement を使用して、
FrameworkElement から派生できるゲージ全体を表し、その OnRender メソッドをオーバーライドしてから、DrawingContext を使用してゲージ面と針の両方を描画します。これは、RotateTransform を使用して針を直接アニメーション化することができなくなり、値が変化するたびにゲージ全体を再描画する必要があることを意味します。ゲージ面は描画コードの大部分を表しますが、めったに変更されないため、これは私には非効率的です。ただし、このアプローチは、使用される要素の数の点で最も軽量です。

2 つのカスタム FrameworkElements を使用します。1 つは顔用、もう 1 つは針用
です。現在、このアプローチに傾倒しています。1 つの要素は顔を表し、もう 1 つの要素は針を表します。これにより、RotateTransform で針要素をターゲットにすることができます。その場合、ゲージ コントロールは 3 つの要素で構成されます。面、針、およびそれらの両方を保持する Panel コンテナー (つまり、Canvas、Grid など) です。したがって、1 つではなく 3 つの要素であるため、最初のアプローチほど軽量ではありません。

DrawingVisuals を使用して顔と針を描画し
ます DrawingVisual クラスについても読みましたが、FrameworkElement から派生させて OnRender をオーバーライドするのではなく、なぜこれを使用するのかについては少し混乱しています。とにかくカスタムFrameworkElement。このアプローチは、2 番目のアプローチよりも利点がなく、より多くのコードが必要になるように思われますが、何か不足している可能性があります。

人々がどのアプローチが最善であると考えているか、またその理由についての考えやアドバイスは大歓迎です!

4

2 に答える 2

1

個人的には、2 番目の方法を使用して CustomControl を作成することをお勧めします。同時に 1000 を超えるゲージを表示する場合を除き、ビジュアル ツリーの余分な要素に気付くことはなく、作成と保守がはるかに簡単であることがわかると思います。

于 2009-04-23T13:47:25.227 に答える
1

スライダー コントロールのスタイルを設定し、それに値を入力するだけです。スライダーを、必要なあらゆる種類のゲージのように見せることができるはずです。

于 2009-04-24T19:08:35.950 に答える