かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

すっきり!