問題タブ [elementhost]
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# - ElementHost の再描画
WinFormsアプリケーションでAvalonEditを使用しています。AvalonEditは、 ElementHostを持つコントロールに配置されます。アプリケーションにはTelerik のRadDockがあり、そのウィンドウに AvalonEdit を配置できます。多くの場合、ElementHostの再描画で問題が発生します。すべての症状を把握しているわけではありませんが、フォーカスを変更し、他のウィンドウをエディター上に移動することで、この問題を再現できます。この後、アプリケーションのすべての WPF コントロールが壊れて再描画できなくなります。ElementHostを強制的に再描画する唯一の方法リサイズ中です。たとえば、幅を変更すると、WPF コントロールが再描画されます。しかし、この「解決策」は受け入れられません。この問題は、x64 および x86 マシンで、ドッキング ウィンドウまたはフローティング ウィンドウ、アクティブなスクロールバーの有無にかかわらず、ウィンドウで再現できます。ElementHostを「修正」するには、アプリケーションを再起動する必要があります。
誰か私に提案はありますか?
c# - ElementHost + FlowDocument = GC が機能していない、メモリが増え続ける
[更新、下部を参照してください!]
FlowDocumentReader
で WPFをホストしている WinForms アプリケーションにメモリ リークがありますElementHost
。この問題を単純なプロジェクトで再現し、以下のコードを追加しました。
アプリケーションの機能
押すとbutton1
:
UserControl1
のみを含むがFlowDocumentReader
作成され、 に設定されElementHost
ますChild
- は
FlowDocument
テキスト ファイルから作成されます (数千行の とFlowDocument
が含まれているだけです) 。StackPanel
<TextBox/>
- のプロパティはこれに設定されてい
FlowDocumentReader
ますDocument
FlowDocument
この時点で、ページはFlowDocument
正しくレンダリングされます。予想通り、大量のメモリが使用されます。
問題
をもう一度クリックする
button1
と、メモリ使用量が増加し、プロセスが繰り返されるたびに増加し続けます! 大量の新しいメモリが使用されているにもかかわらず、GC が収集されません! 次の理由により、そこにあってはならない参照はありません。whichを null
button2
に設定elementHost1.Child
して GC を呼び出すと (以下のコードを参照)、別の奇妙なことが起こります。メモリはクリーンアップされませんが、数秒間クリックし続けると、最終的にメモリが解放されます!
このすべてのメモリが使用されたままになることは、私たちにとって容認できません。また、コレクションElementHost
からを削除し、参照を null に設定してから GC を呼び出しても、メモリは解放されません。Controls
Disposing
私が欲しいもの
- が複数回クリックされた場合
button1
、メモリ使用量が増え続けることはありません - すべてのメモリを解放できるはずです (これは「実際の」アプリケーションの 1 つのウィンドウにすぎず、閉じているときにこれを実行したい)
これは、メモリ使用量が問題にならないものではなく、いつでも GC に収集させることができます。実際には、マシンの速度が著しく低下します。
コード
VS プロジェクトをダウンロードしたい場合は、ここにアップロードしました: http://speedy.sh/8T5P2/WindowsFormsApplication7.zip
それ以外の場合は、関連するコードを次に示します。デザイナーでフォームに 2 つのボタンを追加し、それらをイベントに接続するだけです。Form1.cs:
UserControl1.xaml
編集:
私はついにこれに再び対処する時間ができました。私が試したのはElementHost
、ボタンを押すたびに再利用する代わりに、破棄して再作成することです。これは少しは役に立ちますが、ボタン 1 をクリックするだけでメモリが上がるのではなく、スパム クリックするとメモリが上下するという意味では、それでも問題は解決しません。フォームは閉じています。だから今、私は賞金を上げています。
ここで何が問題なのか混乱しているように見えるので、リークを再現するための正確な手順は次のとおりです。
1) タスクマネージャーを開く
2) 「開始」ボタンをクリックしてフォームを開きます
3) 「GO」ボタンを 12 回または 2 回クリックしてスパムし、メモリ使用量を監視します。これで、リークに気付くはずです。
4a) フォームを閉じます -メモリは解放されません。
また
4b)「CLEAN」ボタンを数回スパムすると、メモリが解放されます。これは、これが参照リークではなく、GC/ファイナライズの問題であることを示しています
私がする必要があるのは、ステップ 3) でリークを防止し、ステップ 4a) でメモリを解放することです。「CLEAN」ボタンは実際のアプリケーションにはありません。隠し参照がないことを示すためだけにここに表示されています。
「GO」ボタンを数回押した後、CLR プロファイラーを使用してメモリ プロファイルを確認しました (この時点でのメモリ使用量は ~350 MB でした)。16125 (ドキュメント内の量の 5 倍)Controls.TextBox
と 16125があり、どちらもファイナライズ キューにルートされているControls.TextBoxView
16125オブジェクトにルートされていることがわかりました。こちらを参照してください。Documents.TextEditor
http://i.imgur.com/m28Aiux.png
任意の洞察をいただければ幸いです。
別の更新 - 解決済み (一種)
ElementHost
または を使用しない別の純粋な WPF アプリケーションでこれに再び遭遇したFlowDocument
ので、振り返ってみると、タイトルは誤解を招くものです。Anton Tykhyy が説明したように、これは単に WPFTextBox
自体のバグであり、そのTextEditor
.
Anton が提案した回避策は好きではありませんでしたが、彼のバグの説明は、やや醜いが短い解決策に役立ちました。
を含むコントロールのインスタンスを破棄しようとしているときは、TextBoxes
(コントロールのコード ビハインドで) これを行います。
どこFindVisualChildren
にある:
基本的に、私はTextBox
すべきことをします。最後に、私も呼び出しますGC.Collect()
(厳密には必要ではありませんが、メモリをより速く解放するのに役立ちます)。これは非常に醜い解決策ですが、問題を解決しているようです。TextEditors
ファイナライズ キューでスタックすることはもうありません。
wpf - ScrollBarが表示されても、WPFScrollviewerDesiredSizeは増加しません
を含むWPF UserControl
(の内部ElementHost
)ScrollViewer
がありItemsControl
ます。はHorizontalScrollbarVisibility
に設定されてAuto
いるため、スクロールが不要な場合は、ScrollBar
が非表示になります。
私の要件は、ScrollBar
が表示/非表示になった場合、ElementHost
それに応じて高さを調整することです。それを達成するために、私はSizeChanged
イベントを聞いています。私はのを取得しDesiredSize
、ScrollViewer
次にEventHandler
に渡しDesiredSize.Height
ますElementHost
。
- 2.3 。
1つの方法として、これは機能します。ScrollBar
表示されている場合(状況1)、ウィンドウを拡大して、すべてのアイテムItemsControl
が表示され、ScrollBar
消え、ElementHost
高さが低くなるように調整します(状況2)。隠されDesiredSize
た瞬間に実際に小さくなりました。ScrollBar
ただし、逆の場合は機能しません。表示されない場合(状況2)、aが必要になりScrollBar
、表示されるまでウィンドウサイズを縮小します。同じままで、調整されません(状況3)。ScrollBar
DesiredSize
ElementHost
何か案は?
これは、Scrollviewer
いくつかのMVVMのものを含むのxamlですが、これにこだわる必要はありません。要点は、実際には、表示DesiredSize
されたときに増加しないのはなぜScrollBar
ですか?なぜ縮むだけなのか?
ScrollViewerスタイル(基本的にデフォルトのWPF):
c# - 透明に設定されている場合のコントロールの背景色が黒くなる
WPF elementHost の背景色に問題があります。パネルに UserControl(Winform) をロードする winform があります。そのユーザー コントロールには 2 つのパネルがあり、それぞれの内部に、WPF ユーザー コントロールをホストする elementHost があります。
画像はより役立つ場合があります。
ご覧のとおり、それぞれの背景色は BLACK ですが、要素は次のように表示されます。
これは、パネルに他の UserControls をロードしたときに発生したことに気付きました。これを修正する方法を知る必要があります。
各 elementHost の背景色は透明に設定され、BackColorTransparent は True に設定されています。また、実行時に背景色を変更しようとしましたが、それでも同じ問題です。
更新: わかりました、フォームのイベント Load でパネルに UserControl をロードすると、elementHost が正しくロードされることに気付きました。しかし、ボタン クリック イベントでパネルに UserControl をロードすると、その黒い背景色が表示されます。
動作:
動作しない:
明らかに、1 つの UserControl を使用している場合は、Load イベントを使用することが解決策になりますが、そうではありません。
c# - Winform ElementHost の MouseEnter イベント
WPF UserControl を含めるために、elementHost を含む Winform があります。私が必要とするのは、マウスが子ではなく elementHost に入ったときに何かをすることです。elementHost で MouseEnter イベントを使用しようとしましたが、存在しません。これができる可能性はありますか?それとも不可能なだけですか?それらにマウスイベントがないのは興味深いことです。
これは私が持っているすべてのイベントです:
プログラムで実行したい場合は、MouseEvent がありません。
c# - 要素ホストから要素を変更
私はDataGrid
いくつかの行を持っています:
2 つの winfrom のように座っDataGrid
て:ElementHost
あるウィンドウで行を非表示にしたいのですが、どうすればよいですか? (XAML を優先)。
wpf - wpf要素ホストをWinformにバインドする
私はwpf element host
座っていwinfrom
ます。
要素のプロパティをwinfromのプロパティにバインドしたいと思います。
検索で、winfromからwpfへのバインドという反対の解決策を見つけました(winがwpfにある場合)。
ここに例: WPFでWindowsコントロールをバインドする方法????
私もこの答えを見ました(正確には答えではありません、結論を言います):WinFormsでWPFホストコントロールのDependencyPropertyにバインドする
それは私を助けませんでした..
また、wpf要素ホストでMVVMの原則を維持したいと思います。
これを行う方法はありますか?
c# - c# windowsフォームプロジェクトのWPFコンポーネントのエラーを解決するには?
Windows C# プロジェクトを作成しました。Windows フォームが 1 つあります。同じプロジェクトで WPF コンポーネントを作成しましたが、このコンポーネントを Windows フォームに配置しようとすると、「コンポーネントの作成に失敗しました」というエラーが発生します。
エラーの詳細については、以下のリンクを確認してください。
1.ツールボックスからコンポーネントをドラッグしてこのエラーを形成すると、次のエラーが発生します。
2. ElementHost で WPF コンポーネントを選択しているときに、次のエラーが発生します。
これを助けてください。
c# - wpf 要素ホストのサイズを変更すると黒いフラッシュバックが発生する
としてWPF UserControl
表示される があります。Winform
Element Host
画面サイズをすばやく変更したり、サイズを変更したりすると、UserControl が適切なサイズになるまで、背景に黒いフラッシュバックが表示されます。
私はそれについていくつかの場所で読みました。
私がそれらを読んだすべての場所で、それはUserControl Loadでのみ発生し、それに応じてソリューションをもたらします。
Resizeで起こっていることについて話しているのを見た1つの質問。しかし、そこで提供される解決策はLoadにもあります。
画面のサイズ変更で次のことを試してみましたUserControl.CreateGraphics ();
。上記の回答のように黒い線は残りません。
LoadではなくResizeで使用したためだと思います。
その上、何も見つかりませんでした。
誰かがこれに遭遇して解決策を見つけた場合、私は答えたいと思います.