1つ前の記事でWPFContentControlなるものをこさえてまでやった方法ですが、Friendly作者の石川さんに聞いたらさくっともっといい方法を教えてもらえました。
AppVar型にもLogicalTreeメソッドはあるのじゃよ
個人的にWPFContentControlを作ったのはLogicalTreeメソッドとかを使いたかったからでした。AppVar型にもLogicalTree拡張メソッドがあるということを教えてもらったのでこう書けます。
var window = new WindowControl(app.Type<Application>().Current.MainWindow); // Point1 Frameをとって、そのContentをとってAppVarに入れる AppVar page = window.LogicalTree().ByType<Frame>().Single().Dynamic().Content; // Point2 PageのLogicalTreeをとってごにょごにょする var btn = new WPFButtonBase(page.LogicalTree().ByType<Button>().Single()); var txt = new WPFTextBlock(page.LogicalTree().ByType<TextBlock>().Single()); Assert.AreEqual("", txt.Text); btn.EmulateClick(); Assert.AreEqual("Hello world", txt.Text);
VisualTreeを辿る
論理ツリーが切れてるならVisualTreeを辿ればいいじゃない?ということで、以下のような感じに書けます。
var window = new WindowControl(app.Type<Application>().Current.MainWindow); // Point1 VisualTreeからPageをとる var page = window.VisualTree().ByType<Page1>().Single(); // Point2 PageのLogicalTreeをとってごにょごにょする var btn = new WPFButtonBase(page.LogicalTree().ByType<Button>().Single()); var txt = new WPFTextBlock(page.LogicalTree().ByType<TextBlock>().Single()); Assert.AreEqual("", txt.Text); btn.EmulateClick(); Assert.AreEqual("Hello world", txt.Text);
すっきり!