如何以编程方式引发SizeChanged事件

时间:2016-07-18 11:02:55

标签: c# wpf unit-testing mstest

我正在尝试在SizeChangedEventHandler中执行代码,但以下内容无效:

[TestMethod]
public void TestSizeChanged()
{
    var panel = new System.Windows.Controls.StackPanel();

    bool handled = false;
    panel.SizeChanged += (o, e) =>
    {
        handled = true; // how to get this to be executed
    };

    panel.Width = 100; // naive attempt to change size!

    Assert.IsTrue(handled);
}

我最初尝试使用RaiseEvent方法,但由于不知道构造函数参数而对象浏览器没有帮助,因此我无法使用正确的xxxEventArgs类型提供它:

panel.RaiseEvent(new System.Windows.SizeChangedEventArgs()) // does not compile

显然,上述测试没有任何意义,但我正在以正确的方式在单元测试的环境中启动事件。

2 个答案:

答案 0 :(得分:2)

非常奇怪的是,SizeChanged事件不会触发您的代码,它似乎是正确的。也许StackPanel不存在于可视树中,因为它并没有真正显示在屏幕上,所以事件永远不会被触发。 尝试在屏幕上显示带有StackPanel的真实窗口,并以编程方式更改其宽度或高度。

    [TestMethod]
    public void TestSizeChanged()
    {
        Window wnd = new Window();
        wnd.Content = new System.Windows.Controls.StackPanel();

        bool handled = false;
        wnd.SizeChanged += (o, e) =>
        {
            handled = true; // how to get this to be executed
        };

        wnd.Show();
        wnd.Width = 100; // naive attempt to change size!

        Assert.IsTrue(handled);

    }

您无法使用RaiseEvent方法,因为SizeChanged不是RoutedEvent。

答案 1 :(得分:0)

使用以下反映,您可以成功:

//panel =>System.Windows.Controls.Panel instance..
SizeChangedInfo sifo = new SizeChangedInfo(panel, new Size(0, 0), true, true);
SizeChangedEventArgs ea = typeof(System.Windows.SizeChangedEventArgs).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).FirstOrDefault().Invoke(new object[] {(panel as FrameworkElement),sifo }) as SizeChangedEventArgs;
ea.RoutedEvent = Panel.SizeChangedEvent;
panel.RaiseEvent(ea);
相关问题