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

C# 如何以编程方式引发SizeChanged事件,c#,wpf,unit-testing,mstest,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 t

我试图在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

显然,上面的测试毫无用处,但我正在寻找在单元测试环境中触发事件的正确方法

非常奇怪的是,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。

奇怪的是,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。

使用以下反射可以成功:

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

使用以下反射可以成功:

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

为什么要将此添加为单元测试?您是在测试窗口更改是什么,还是在测试调整大小时调用的代码的逻辑?@BenSteele是的,后者。我可以在代码中移动一些东西,但一直在顽固地尝试测试,这就是为什么要将其作为单元测试添加?您是在测试窗口更改是什么,还是在测试调整大小时调用的代码的逻辑?@BenSteele是的,后者。我可以在代码中移动内容,但一直在顽固地尝试进行测试,因为如果您沿着这条路线,我认为您可能必须更改wnd.ActualWidth,而不是所述的宽度:不,ActualWidth是只读属性。您只能修改宽度值,但要激活SizeChanged事件,您需要在屏幕上显示窗口。我测试了上面的代码,我确认SizeChanged事件已激活。如果您继续这样做,我认为您可能必须更改wnd.ActualWidth,而不是所述的宽度:不,ActualWidth是只读属性。您只能修改宽度值,但要激活SizeChanged事件,您需要在屏幕上显示窗口我测试了上面的代码,并确认激活了SizeChanged事件。