WPFでユニークなUidを持つコントロールがあります。そのUidでオブジェクトを取得するにはどうすればよいですか?WPFのUidでオブジェクトを取得
15
A
答えて
11
あなたはかなりブルートフォースでそれを行う必要があります。ここでは、使用できるヘルパー拡張メソッドです:
private static UIElement FindUid(this DependencyObject parent, string uid)
{
var count = VisualTreeHelper.GetChildrenCount(parent);
if (count == 0) return null;
for (int i = 0; i < count; i++)
{
var el = VisualTreeHelper.GetChild(parent, i) as UIElement;
if (el == null) continue;
if (el.Uid == uid) return el;
el = el.FindUid(uid);
if (el != null) return el;
}
return null;
}
次に、あなたがこのようにそれを呼び出すことができます。
var el = FindUid("someUid");
+0
'GetChild(parent、N)'はO(N)の複雑さを持っていませんか? foreachのアプローチは私にとってはより清潔で(そしてより明確に)見えます。 – AgentFire
2
これは良いです。
public static UIElement FindUid(this DependencyObject parent, string uid) {
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++) {
UIElement el = VisualTreeHelper.GetChild(parent, i) as UIElement;
if (el != null) {
if (el.Uid == uid) { return el; }
el = el.FindUid(uid);
}
}
return null;
}
+0
あなたのコードがうまくいかない場合は、それを改善することはできません。あなたの再帰は壊れています。 'el.FindUid(uid)'の結果(nullでない場合)を返す必要があります。 –
2
public static UIElement GetByUid(DependencyObject rootElement, string uid)
{
foreach (UIElement element in LogicalTreeHelper.GetChildren(rootElement).OfType<UIElement>())
{
if (element.Uid == uid)
return element;
UIElement resultChildren = GetByUid(element, uid);
if (resultChildren != null)
return resultChildren;
}
return null;
}
1
私はトップの答えを持っていた問題は、それが彼らのコンテンツ内の要素のために(たとえば、ユーザーコントロールなど)コンテンツコントロールの内部で見ていないということです。これらを検索するために、互換性のあるコントロールのContentプロパティを調べる関数を拡張しました。
public static UIElement FindUid(this DependencyObject parent, string uid)
{
var count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
var el = VisualTreeHelper.GetChild(parent, i) as UIElement;
if (el == null) continue;
if (el.Uid == uid) return el;
el = el.FindUid(uid);
if (el != null) return el;
}
if (parent is ContentControl)
{
UIElement content = (parent as ContentControl).Content as UIElement;
if (content != null)
{
if (content.Uid == uid) return content;
var el = content.FindUid(uid);
if (el != null) return el;
}
}
return null;
}
関連する問題
- 1. tt_content uidを取得する
- 2. UIDからFirebaseUserを取得
- 3. リポジトリに追加した後にオブジェクトのUIDを取得する
- 4. 変数でUID firebase authを取得
- 5. メールキットでuidを取得するには?
- 6. FirestoreのUIDリファレンスを取得する
- 7. ファイルアップローダのUIDを取得する
- 8. の取得、ユーザーのuid以下
- 9. フックで新しいレコードのuidを取得するprocessDatamap_afterDatabaseOperations
- 10. Firestoreクラウド機能のuidで認証ユーザーを取得
- 11. SPIなしでRFIDカードのUID値を取得
- 12. UIDでGoogleプロフィール画像のURLを取得する
- 13. BASH - シェルスクリプトでUIDを取得できない
- 14. Angular2を使用してFirebaseでプロバイダUIDを取得
- 15. TYPO3 - Viewhelper経由でFE UIDを取得する方法
- 16. サービス経由でFirebaseからユーザUIDを取得
- 17. jnrfuseでUIDとGIDを取得する方法
- 18. ネットワーク接続のUIDを取得してショートリンクを作成する
- 19. Uid Firebaseのすべてのデータを取得します。Android
- 20. WPFコマンドバインディングに応答するUI以外のオブジェクトの取得
- 21. bionic libcのuidを取得するには?
- 22. Facebook SDK-PHP:接続されたユーザーのUIDを取得する
- 23. 現在のデータUIDを取得するには?
- 24. ツリーノードのuidをすべて取得する
- 25. TYPO3:作成されたレコードのUIDを取得する
- 26. スマートカードuidを取得するためのAPDUコマンド
- 27. NXP MIFARE DESFire EV1カードのUID /シリアル番号を取得する
- 28. 自分のuidからFIRUserを取得する
- 29. WPFのPdfiumでCharIndexを取得
- 30. キャンバスのwpfですべてのオブジェクト座標を取得する方法
ご了承ください。あなたのUIDは何ですか?どのように設定されていますか? –
これはwpfやsilverlightのコントロールの依存関係プロパティです。私はこれを解決することができましたが、組み込みのメソッドが存在するかどうかは疑問でした。 – jose