かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

すっきり!