追記
この記事の内容より良い方法がありましたので上の記事に書いてます。
あと、この記事に書いたWPFContentControl足してもらえたみたいです。
元記事
という要望がありました。
WindowControlのLogicalTreeで辿ればいいや!って思ってたら、FrameはContentにPageを持つからPageの中はLogicalTree切れてるので検索できないっぽいですね?(自分では試してない)
ということなので、Frameをとってきて、そいつのContentのLogicalTreeを辿ればいいということになります。FriendlyのWPF用のパッケージには、FrameやらPageやらを操作するためのクラスがないということで、無いならまずは作ります。FrameもPageもContentControlなので、WPFContentControlというクラスを用意します。
class WPFContentControl : WPFControlBase4<ContentControl> { public WPFContentControl(AppVar c) : base(c) { } public AppVar Content { get { return this.Dynamic().Content; } } }
あとは、こんな雰囲気でFrameをとってContentをとってContentのLogicalTreeから目的のコントロールをとる感じでいけます。さくっと作ったボタン押したらHello worldってなるアプリだとこんな感じ。ButtonとかTextBlockとかのとり方はアプリに合わせて変わるので、よしなに。
[TestClass] public class UnitTest1 { private Process process; private WindowsAppFriend app; [TestInitialize] public void Initialize() { this.process = Process.Start("WpfApplication5.exe"); this.app = new WindowsAppFriend(this.process); } [TestCleanup] public void Cleanup() { this.app.Dispose(); this.process.Kill(); } [TestMethod] public void TestMethod1() { var window = new WindowControl(app.Type<Application>().Current.MainWindow); // Point1 Frameをとる var frame = new WPFContentControl(window.LogicalTree().ByType<Frame>().Single()); // Point2 FrameのContentをとる(こいつがPage) var page = new WPFContentControl(frame.Content); // Point3 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); } }
WPFContentControlくらいは標準で入っててほしかったかも?