問題タブ [logical-tree]
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# - 視覚的および論理的なツリー トラバーサルが複数のレベルを取得しない
同じアプリケーションから論理ツリーと視覚ツリーを探索していますが、レベルをさらに深くすることはできません。
私のコードでは、汎用エクスプローラーを使用しています。
ProcessLogicalTree
単純に反復します (再呼び出しProcessVisualTree
の前に何かを行います)。ProcessGenericTree
TextBlock
結果は完全に見えますが、 をヘッダーに取得しようとするとGridViewColumn
、 の論理リーフ リストにもビジュアル リーフ リストにもアイテムが存在しないように見えますFrameworkElement
。
Visual ElementからLogical Elementへの変換のようです。実際、時計を追加すると、これは私のVisual ChildrenTextBlock
に表示されます (論理として取得され、選択されていません) が、私のコードはそれを取得できません。GridView
Tab Item
私の呼び出しは非常に簡単です:
root は MainWindow です。
では、ツリーの最も深いレベルを探索するにはどうすればよいでしょうか? たぶん、取得したFrameworkElement
リストを繰り返しますか? 私のProcessGenericコードはすでにそれを行っていると思います。
更新: WPF ビジュアライザーは、この種の構造を示しています。
GridViewColumnHeader
レベルには myTextBlock
が含まれていますが、ビジュアル ツリーには含まれていません。
更新 2 : 要素が表示されているメイン ウィンドウから再帰を使用すると、次のコードで指定された名前のオブジェクトを見つけることができません。
VisualTreeHelper
Header プロパティ内の要素を取得できないと確信していますが、 WPF インスペクターは正しく動作します。
ツリーをトラバースするために別のアプローチを使用しているのだろうか(おそらく検査Properties
もHeader
)。提案?
wpf - リリースで「指定された要素はすでに別の要素の論理的な子です」をデバッグする方法
コードサンプルを使用して非常に具体的な質問を投稿することになっていることはわかっていますが、どこから始めればよいかわかりません。
Visual Studio でアプリを実行している間は、デバッグ モードとリリース モードの両方で問題ありません。しかし、InstallShield インストーラーを作成すると、他のコンピューターで例外が発生します。
System.Windows.Threading.Dispatcher WPF 指定された要素は、既に別の要素の論理的な子です。最初に切断する
StackOverflow や他の Web でこの問題に関する多くの投稿を見てきましたが、インストールされたパッケージでのみ発生する参照はありません。
私の質問は二重です(それも申し訳ありません):
- どうすればそのような問題をデバッグできますか? つまり、特に可能であれば(一般的なランタイムデバッグではありません)
- エラーに関する詳細情報を得るには、どのような種類の例外をキャッチできますか? ReflectionTypeLoadException を示す MessageBox を表示しています。どの要素が「二重の親」または「二重の子」を持つ要素かを知りたいです。
さらに複雑なことに、このアプリは私が開発に使用しているコンピューターでは正常に動作しますが、他のコンピューター (たとえば、父と妹のコンピューター) ではこの例外でクラッシュします。
どんな手がかりも高く評価され、正当に支持されます。ありがとう
- - - - - - - - - - - - - - - - - -編集 - - - - - - - -----------------------
ListView の ItemTemplate 内の "textAvisosSeccion" という名前の TextBlock に問題のある子を追い詰めることができました。
バインディング Text="{Binding Value.Avisos}" を確認してください。ListView はLazy<T>
、T が "Avisos" プロパティを持つ、MEF でインポートされた のコレクションにバインドされます。他の TexkBlock はLazy<T>
のメタデータにバインドされており、問題ありません。
レイジーの値にバインドしている理由 (オブジェクトをインスタンス化し、レイジーの利点を失う) のほかに、このために「指定された要素は既に別の要素の論理的な子です」という例外が発生するのはなぜですか?!?!?
「Avisos」プロパティは、ViewModel (UIElement から継承されていない) 内の単なる整数です。
編集#2:
このような例外 (スタイルの問題、MEF 構成の問題など) は、コンピューターに .NET Framework 4.5 がインストールされているため、VS2012 ではスローされませんでした。すべてのプロジェクトが Framework 4.0 を対象としていたとしても.
4.0 向けに開発している場合は、Vista を搭載した古いマシンを入手してください。4.0 がインストールされていることを確認し、VS2010 を使用してください。それが確認する唯一の方法です。
c# - カスタム コントロールの論理ツリーの構築
ObservableCollection
の 1 つとしてを持つコントロールに取り組んでいDependencyProperties
ます。このプロパティはDefaultProperty
コントロールの として設定されるため、次のような行を作成することで、XAML のコレクションに項目を暗黙的に追加できます。
私の知る限り、WPF エンジンは XAML を解析するときに論理ツリーを構築します。したがって、それぞれMyItem
が の論理的な子である必要がありMyControl
ます。逆に、MyControl
は各 の論理的な親である必要がありますMyItem
。
まあ、どうやらそれ以上のものがあるようです。以下は、上記の関係を定義するために使用するコードです。カスタム コントロールにはDependencyProperty
for が含まれてObservableCollection
おり、CLR プロパティによってサポートされています。
MyItem
(を継承する)からFrameworkContentElement
、次のように論理的な親にアクセスしようとします。
驚いたことに、親コントロールは再レンダリングされません。これは、MyItem.Parent
プロパティが null であるためです。どうしてこれなの?
MyControl
の論理的な親であることを WPF エンジンに指示するにはどうすればよいMyItem
ですか?
c# - 論理親の使用機能
たぶん私の質問は完全にばかげているかもしれませんが、私は最善を尽くしています。
私がやりたいのは、親要素の関数/プロパティを使用することだけです。
意味のない簡単な例を用意しました:
ありがとうございました!
編集:もう少し情報を提供する必要があると思います。
ユーザーは値をキャンバスにドラッグできます。私のキャンバスは親クラスのリストにあります。今私のキャンバスは、リスト内の他のキャンバスがすでに同じ値を持っているかどうかを知りたがっています。
実現する私の考え:
ユーザーがドラッグする --> Canvas がイベントを取得する --> Canvas が親クラスに、他の Canvas に既に同じ値があるかどうかを問い合わせる --> どうするかを決定する。
明日はもっと詳しい例を投稿します!
c# - コンテンツ コントロール内のビジュアル要素の解析: ビュー モデルの問題
私が抱えている小さな問題に対する明確な解決策が必要です。標準のメイン ページ ビューとそのビュー モデルがあり、ビュー内にビュー モデル (DossierViewModel) を使用してユーザー コントロール (Dossier) を表示します。
メイン ビューモデルからビューを動的にインスタンス化するために、 DataTemplate と ContentControl を使用しました。
ここでは問題ありません。
しかし、特定の視覚要素の状態を保持するために、ウィンドウ内のすべてを解析するメイン関数があります。TreeHelper を使用して ContentControl の子を取得すると、ビュー モデル DossierViewModel のみが取得されます。私が欲しいのは、このビューモデルにバインドされたユーザーコントロールの視覚要素です。
どうすればそのギャップをジャンプできますか?
c# - ContentControl でホストされている UserControl の親を取得するには?
WPF アプリケーションでは、ContentControl
. この ContentControl には、View
.
特定UserControl
の から始めて、その論理ツリーを上っていき、途中ですべてのコンポーネントを「アクティブ化」しようとしています。たとえば、一方の親が である場合、Tab
例によってそれを選択します。
私の問題は、私UserControl
がにあるとき、私がContentControl
呼び出したときにLogicalTreeHelper.GetParent(...)
nullを受け取るということです:
私のXamlは次のようなものです:
だから:そのContentControl
中のコントロールから取得する方法はありますか?
編集コントロールが選択されていないタブにあるという事実に関連しているようです(私の機能の目標は、何かにバインドされたユーザーコントロールが配置されているタブをアクティブにすることです)。