問題タブ [onrender]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - カスタム プログレス バーをコードで描画する方法 (WPF)
WinForms カスタム プログレス バーを作成しましたが、少しちらつきます。ダブルバッファリングされていますが、まだ少しちらつきがあるので、WPF を試して、少しちらつきがなくなるかどうかを確認しています。
私はWPFにまったく慣れていません。私が読んだ限りでは、WPF の OnPaint(PaintEventArgs e) メソッドは OnRender(DrawingContext drawingContext) と呼ばれています。
問題:
私のイメージは緑色のバーを「上書き」していません。ここで、Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
... に変更するとRect myRect = new Rect(0, 50, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
、結果は次のようになります。
そのため、レインボー バーは描画されますが、プログレス バーの上には描画されません。私が書いた場合Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
、それは描画されますが、プログレスバーの下にあります。レインボー プログレス バー (およびその他のカスタム プログレス バー) を表示するにはどうすればよいですか?
ご協力ありがとうございました。
編集:元のプログレスバー(少しちらつくもの)には、虹以上のものがあります。レインボーから始めて、WPF で簡単なテストを行い、他のものを追加してみました。なぜこのような単純なプログレス バーが WinForms で点滅していたのか疑問に思っている場合に備えて。それは、WinForms の方が虹以上のものを持っていたからです。ありがとうございました。
c# - WPF でタイムラインを動的に描画する方法
WPF でタイムラインを描画しようとしています。基本的に 3 つの長方形で構成されている必要があります。
次のようになります (XAML を使用してハードコードされています) 。
大きな白い四角形は利用可能なスペースをすべて埋め、緑の四角形はタイムラインで発生するイベントの開始と期間を表します。
これを表すモデルは、TimeSpan 開始と、イベントの開始時刻と持続時間 (ティックまたは秒など) を表すタイムスパン期間を持つ TimeLineEvent クラスです。タイムライン上のすべてのイベントを保持する ObservableCollection を持つ TimeLine クラスもあります。また、タイムライン自体の長さを表す TimeSpan 期間もあります。
私がする必要があるのは、イベント (緑色の四角形) をタイムライン上で動的に描画できるようにすることです。これは、イベントの継続時間と開始時間、およびこれらの比率に基づいて、イベントがいつ発生し、どのくらいの長さに対応して描画されるようにするかということです。タイムラインには複数のイベントが存在する場合があります。
これまでの私のアプローチは、canvas 要素を保持するだけの TimeLine.xaml ファイルを作成することでした。コード ビハインド ファイルでは、OnRender メソッドをオーバーライドして、これらの四角形を描画します。これは、ハードコードされた値で機能します。
MainWindow.xaml でデータ テンプレートを作成し、データ型を TimeLine に設定しました。
このためにさまざまな設定を試しましたが、正直なところ何をしているのかわかりません。次に、データ テンプレートを使用し、TimeLine オブジェクトを保持する ObservableCollection である TimeLines をバインドするリスト ボックスを MainWindow コード ビハインドに含むスタック パネルがあります。
これにより、新しい Timeline オブジェクトを作成すると、次のように新しいタイムラインが描画されます 。
これに関する問題は、緑色の長方形が適切にレンダリングされないことです。これを行うには、白い長方形の幅を知る必要があります。これにより、異なるデュレーションの比率を使用して位置に変換できます。問題は、OnRender メソッドが呼び出されたときに width プロパティが 0 であるようです。ここに示すように、OnRenderSizeChanged をオーバーライドしようとしました: WPF では、実際にレンダリングする前にコントロールのレンダリングされたサイズを取得するにはどうすればよいですか? デバッグ印刷で、OnRender が最初に呼び出され、次に OnRenderSizeChanged が呼び出され、次に this.InvalidateVisual(); を呼び出して OnRender が再度実行されることを確認しました。オーバーライドで。私が得ることができるすべての幅のプロパティはまだ常に 0 ですが、レンダリングされてサイズがあることがわかるので、これは奇妙です。他の投稿に示されているように、メジャーとアレンジのオーバーライドも試しましたが、これまでのところ 0 以外の値を取得できませんでした。
では、正しい位置とサイズでタイムライン上に四角形を動的に描画するにはどうすればよいでしょうか?
ここで明らかな何かが欠けている場合は申し訳ありません。私はWPFを1週間使用していて、尋ねる人がいません。コードサンプルをもっと見たい場合はお知らせください。どんな助けでも大歓迎です:)。