かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

FriendlyでFrameを使ったアプリをテストする その2

blog.okazuki.jp

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);

すっきり!