3

私はちょっとここで立ち往生しています。XamlWriter.Save() を介してドラッグされた UIElements をシリアル化する dragndrop-library を使用しています。

今、Grid を拡張するクラスのいくつかのインスタンスをドラッグドロップしようとしています。コンストラクターで、いくつかの要素をビジュアル ツリーにプッシュします。オブジェクトが逆シリアル化され、要素が再び追加されると、コンストラクターが呼び出されます (ドラッグドロップの頻度に応じて何度も何度も)。悲しいことに、コンストラクター内から値を取得した場合、Children.Count は子要素がないことを教えてくれます。外部から(myGrid.Children.Countによって)取得すると、より高い(不要な)量が得られます。

ビジュアルを初期化するために使用する必要がある他の関数はありますか? またはそれらの重複を防ぐ他の方法はありますか?

感謝と乾杯

4

1 に答える 1

1

少し時間がかかりましたが、解決策を見つけたようです。
これで、すべてのサブクラスが必要とするビジュアル要素を既に含む基本クラスを作成できるようになりました。XamlWriter/Reader を介して重複なしで解析できます。ふう。

1) UserControl を拡張します (Add->UserControl ではなく、Add->Class を使用して手動で継承します)
2) 標準の InitializeControl(); を配置します。コンストラクターに
3) InitializeControl() を実装し、そこにレイアウト、子の追加などを入れます
4) 狂ったように xamlwrite/xamlread/inherit

それが誰かに役立つことを願っており、私は予期せぬことを監督していません..

-- 編集: もちろん。重複がありますが、それらを見ることはできません。XamlReader が通過した後、InitializeComponent() によって作成された UIElements と、その後 xaml で解析された UIElements があります。コード内の参照は、表示されないコードで作成されたコントロールに関するものです:/

はぁ。

これを回避する完全な方法とはほど遠い方法の 1 つは、スイッチを Initialized イベント ハンドラーに配置することです 。たとえば 、Initialize() がビジュアル ツリーに UIElements を追加する場合、Reinitialize() は適切な参照 (by ) と Multiinitialzeを見つけるだけです。 () は、イベント ハンドラーを再作成し、XamlReader を通過する途中で失われるものを再作成します。if(HasContent)
Initialize();
else
Reinitialize();
Multiinitialize();

control = FindName("controlName")

さて、カスタムの継承された UserControl を xaml でインスタンス化できるようになりましたが、属性を設定する簡単な方法はありません。これは、Initialized イベントの前に属性の設定が行われ、NullPointerExceptions が待機しているためです。あなたは私が推測するバインディングでそれを回避することができます.

しかし、もっと簡単な方法が必要です。私にお知らせください!

于 2010-07-07T11:02:47.007 に答える