8

私はXamlReader正常にxamlファイルをロードし、FrameworkElement作業するファイルを作成しています。

読み込んでいる xaml には、次のようなバインディング式が含まれています。

<TextBlock Text="{Binding DataContextTextProperty}" />

取得した FrameworkElement をXamlReader.Load()WPF ウィンドウに配置すると、バインディングはすべて正常に機能します。

ただし、この場合、WPF/XAML からの PNG の作成に関する Laurent Bugnion の優れた記事を使用しています。の結果はXamlReader.Load()を介し​​て PNG に直接書き込まれるため、VisualBrushバインド式を呼び出すために必要な WPF のメカニズムがバイパスされているようです。

これにより、実際のバインディングは を呼び出すだけでは実際には呼び出されてXamlReader.Load()いないか、またはFrameworkElementを既存のビジュアル ツリーか何か。

これらのバインディングが確実に呼び出されるようにするためにできることはありますか?

よろしくお願いします。

4

1 に答える 1

5

それを私が直した!!

ええと、説明させてください...

どうやってそれを実現したのかわかりませんが、MSDNで、オブジェクトツリーにないオブジェクトの初期化に関する役立つ記事を見つけました。

その中に、次のコード例があります。

Button b = new Button();
b.BeginInit();
b.Background = Brushes.Blue;
b.Width = b.Height = 200;
b.EndInit();
b.Measure(paperSize);
b.Arrange(new Rect(paperSize));
b.UpdateLayout();

上記の質問で述べたLaurentの(再び優れた)例を見て、XamlReader次のように使用法をカスタマイズしました。

var element = (FrameworkElement)XamlReader.Load(xamlInput);

element.BeginInit();
element.DataContext = dataContext;

...

element.Measure(renderingSize);
element.Arrange(renderingRectangle);

element.EndInit();
element.UpdateLayout();

BeginInit()、、EndInit()を追加しましたUpdateLayout()(ただし、削除のプロセスによって重要だと思いUpdateLayout()ます)。これで、動的にロードされたxamlのバインディング式が正しく機能するようになりました。フラ!

于 2011-09-22T13:48:32.930 に答える