問題タブ [visualbrush]
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.
wpf - WPF「レイジー」VisualBrush
現在、「Lazy」VisualBrush のようなものを実装しようとしています。誰かがその方法を知っていますか? 意味: VisualBrush のように動作しますが、Visual のすべての変更で更新されるのではなく、最大で 1 秒に 1 回 (または何でも) 更新されるもの。
なぜ私がこれを行っているのか、そして私がすでに試したことについて、いくつかの背景を説明する必要があります:)
問題: 現在の私の仕事は、かなり大きな WPF アプリケーションのパフォーマンスを改善することです。主なパフォーマンスの問題 (とにかく UI レベルで) を、アプリケーションで使用されているいくつかのビジュアル ブラシに突き止めました。アプリケーションは、いくつかのかなり複雑な UserControls を含む「デスクトップ」領域と、デスクトップの縮小バージョンを含むナビゲーション領域で構成されます。ナビゲーション エリアでは、ビジュアル ブラシを使用して作業を完了しています。デスクトップ項目が多かれ少なかれ静的である限り、すべて問題ありません。ただし、要素が頻繁に変更される場合 (たとえば、アニメーションが含まれているため)、VisualBrushes は暴走します。アニメーションのフレームレートとともに更新されます。フレームレートを下げることはもちろん役に立ちますが、この問題に対するより一般的な解決策を探しています。「ソース」でありながら コントロールは、アニメーションの影響を受ける小さな領域のみをレンダリングします。ビジュアル ブラシ コンテナが完全にレンダリングされると、アプリケーションのパフォーマンスが大幅に低下します。代わりに BitmapCacheBrush を使用しようとしました。残念ながら役に立ちません。アニメーションはコントロール内にあります。したがって、とにかくブラシをリフレッシュする必要があります。
考えられる解決策: VisualBrush のように動作するコントロールを作成しました。(VisualBrush のように) ビジュアルが必要ですが、DiapatcherTimer と RenderTargetBitmap を使用してジョブを実行しています。現在、コントロールの LayoutUpdated イベントをサブスクライブしており、変更されるたびに「レンダリング」がスケジュールされます (RenderTargetBitmap を使用)。その後、実際のレンダリングは DispatcherTimer によってトリガーされます。このようにして、コントロールは DispatcherTimer の頻度で最大で再描画されます。
コードは次のとおりです。
これはこれまでのところかなりうまく機能しています。唯一の問題はトリガーです。LayoutUpdated を使用すると、ビジュアル自体がまったく変更されていなくても、レンダリングが常にトリガーされます (おそらく、アプリケーションの他の部分のアニメーションなどのため)。LayoutUpdated は頻繁に発生します。実際のところ、トリガーをスキップして、トリガーなしでタイマーを使用してコントロールを更新するだけで済みます。それは問題ではありません。また、Visual で OnRender をオーバーライドし、カスタム イベントを発生させて更新をトリガーしようとしました。VisualTree の奥深くで何かが変更されたときに OnRender が呼び出されないため、どちらも機能しません。これが今の私のベストショットです。元の VisualBrush ソリューションよりもはるかにうまく機能しています (少なくともパフォーマンスの観点から)。しかし、私はまださらに良い解決策を探しています。
a) nessasarry の場合にのみ更新をトリガーする方法、または b) まったく異なるアプローチで仕事を完了する方法を知っている人はいますか?
ありがとう!!!
c# - イメージとして WPF ビジュアル オブジェクトをレンダリングすると、真っ黒なイメージが生成される
C#/WPF アプリケーションには、画像に保存する必要がある DataChart オブジェクトがあります。現在、オブジェクトは固定ドキュメントに追加され、次のコードを使用してその固定ドキュメントに正しく表示されます。
ただし、固定ドキュメントにブロックとして追加するのではなく、画像をディスクに保存するだけで済みます。私は次のことを試しました:
ただし、これにより、グラフのサイズで黒一色の画像が表示されるだけで、その理由がわかりません。
私の質問は、DataChart オブジェクトを保存できる PNG または BMP 画像に変換するより良い方法を知っている人はいますか? VisualBrush または Rectangle からイメージへの取得を検索しようとしましたが、上記以外に、必要なことをしているように見えるものは見つかりませんでした。
本当にありがとう!
memory-leaks - WPF - OpacityMask/VisualBrush との境界線: メモリ リーク
私のアプリについての簡単な説明:
私が取り組んでいるアプリケーションは、グリーティング カード デザイナーです。背景画像があり、背景の上にとどまり、移動、サイズ変更、前後に移動できる無数の「レイヤー」(特に写真)があるものを想像してみてください...
星や楕円などの特定の形状をこれらのレイヤーに適用することも可能です..カードが作成された後、jpeg ファイルに保存することが可能です。
問題
すべて正常に動作しますが、シェイプをレイヤーに適用するとメモリ リークが発生することがわかりました。
各レイヤーの UserControl のコードは次のとおりです。
ここで、MaskConverter コードは次のとおりです。
パラメーター "MyMask.Data" は、さまざまな形状を含むテキスト ファイルから動的に読み込む XAMLパス(適用している形状) です。
したがって、原則として、*im_the_problem*という名前の境界線がある場合、メモリは解放されません。*im_the_problem*にコメントすると (つまり、図形のない長方形のレイヤー/画像だけが表示されます)、メモリ リークが発生することなく、すべてが魅力的に機能します。
問題は OpacityMask + VisualBrush にあるはずです。
私は何か間違ったことをしていますか?それとも、既知の問題がありますか? 同じことを別の方法で行う方法はありますか (画像に図形を適用する..)?
ありがとう。
c# - ウィンドウからのVisualBrushは、以前のVisualBrushの画像を保持します
VisualBrushを使用して、TabControlを含むウィンドウのスナップショットを作成しています。
スナップショット#1:
「Dos」(Microsoftではない)、スナップショット#2に切り替えます。
TabControlまたはDockPanelの写真を撮るだけで、すべてが正常に機能します。この問題は、ウィンドウの写真を撮る場合に特有です。ヘルプ!!
背後にあるコード:
Xaml:
c# - WPF-コンテナのコンテンツをジオメトリとして複製します
Ok iveは、大きなキャンバスのサブセクションからページを印刷しようとして、ビジュアルブラシを使用して多くの不運に見舞われました。一般的には機能しますが、一部のパーツをラスタライズする傾向があり、出力が悪くなります。(私は以前にこれについて質問しました)。
だから今、私はすべて同じ内容のキャンバスのコピーの束を作成し、単一のページとして印刷するために個々の部分にピンチダウンしています。これは機能しますが、明らかに遅く、ページ数が増えると遅くなります。
それで、うまくいくかもしれないのは、視覚的なブラシに似た何かをする方法はありますが、代わりに、ある種の新しいジオメトリオブジェクトとしてその「ビュー」からコンテンツをコピーする方法はありますか?私のキャンバスのコンテンツは線や画像などの組み合わせなので、ブラシのビューを定義して、すべてのベクターオブジェクトとラスターオブジェクトの交差コピーを新しいものに表示するように指示できると便利です。ある種のコンテナ。
これにより、1つのキャンバスを使用して、個々のページの印刷に使用するさまざまな場所でコンテンツの「スナップショット」を撮ることができます。
c# - VisualBrush を使用して WPF 領域の System.Drawing.Bitmap を取得する
ポイントは、System.Drawing.Bitmap (.Net Framework 2.0) に変換して、コンテンツを含む WPF グリッドの単一フレームを取得する必要があるということです。
私は読んだことがVisualBrush
ありDrawingBrush
ますが、それがどのように機能するか想像できません。
任意の WPFBitmapSource
をSystem.Drawing.Bitmap
正常に変換できます。BitmapSource
しかし、私のグリッドからどのように受け取るのですか?
ありがとう
c# - グリッドコントロールにスナップパターンを描画します
私は自分が使用している解決策を持っていますが、それは私が必要とするすべての能力を実際に私に与えているわけではありません。
現在、グリッドコントロールの背景を、ビジュアルコンテナに楕円を含むVisualBrushに設定しています。これにより、描画された正方形の背後に背景色を設定することができなくなります(または少なくともこれまでの知識では)。
スナップして配置する機能のマーカーとして、これらの正方形を使用しています。写真を参照してください。
背景パターンを維持し、背景色を設定する方法はありますか?別のアプローチも歓迎されます。これは(部分的に)機能するため、これに雪が降ったような気がします。
需要のため:
これは私がgrid.Backgroundに設定したものです。私がやりたいのは、リンクに表示されているパターンを描画し、その上にドットパターンを使用して背景に色を設定できるようにすることです。
wpf - VisualBrushは「遅延評価」を行いますか?
次のように、FixedDocumentをさらに多くの反復(反復ごとに1ページ)で作成します。
各反復で、MainGridを少し変更します。したがって、各ページにはMainGridの実際の状態が含まれている必要があります。ただし、印刷されたドキュメントには、最後の反復と同じ内容のページが含まれています(つまり、最後の状態はドキュメント内のすべてのページにあります)。VisualBrushなどの「遅延評価」はありますか?
wpf - 1つのFixed(Flow)ドキュメントに保存されたVisualBrushを使用した時間内の制御のスナップショット
Controlのスナップショットを時間内に取得し、それらを1つのFixedDocumentに保存する必要があります。問題は、VisualBrushがどういうわけか「怠惰」であり、ドキュメントに追加しても自分自身を評価しないことです。最終的にドキュメントを作成すると、すべてのページに同じ(最後の)コントロールの状態が含まれます。VisualBrushをフリーズすることはできませんが、他にフリーズする機会はありますか?1ページにスナップショットを増やしたいので、ページごとにドキュメントを生成することは私にとって解決策ではありません。VisualBrushをビットマップに変換するのと同じように(ベクトルで保持したい)。要するに -I need to somehow Freeze() VisualBrush
c# - RenderTargetBitmap が ColumnDefinitions の幅を尊重しない
非表示の列を含む Grid のスナップショットを作成する必要があります (ColumnDefinition.Width = 0 に設定)。
画面上では問題created image
ないように見えますが、すべての列が表示されています(does not respect the ColumnDefinitions)
。RenderTargetBitmap が、これらの変更が存在しない別のレイヤー (ビジュアル レイヤーとレイアウト レイヤー) を見ているためです。正しい ColumnDefinitions を使用してグリッドの現実的なスナップショットを取得する機会はありますか? Rectagnel.Fill = VisualBrush を単純に使用することはできません。これは、これらの画像をサイクルで保存する必要があるためです (すべての反復 = 新しい画像)。
このスニペットのような方法を試しました