【问题标题】:How to programmatically raise SizeChanged event如何以编程方式引发 SizeChanged 事件
【发布时间】:2016-07-18 11:02:55
【问题描述】:

我正在尝试在 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

显然,上述测试没有任何作用,但我正在寻求在单元测试环境中触发事件的正确方法。

【问题讨论】:

  • 为什么要将此添加为单元测试?您是在测试窗口的变化是什么,还是在测试调整大小时调用的代码的逻辑?
  • @BenSteele 是的,后者。我可以在代码中移动东西,但一直顽固地尝试按原样进行测试

标签: c# wpf unit-testing mstest


【解决方案1】:

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

【讨论】:

  • 如果你沿着那条路走,我认为你可能不得不改变 wnd.ActualWidth 而不是所述的宽度:msdn.microsoft.com/en-us/library/…
  • 不,ActualWidth 是只读属性。您只能修改 Width 值,但要触发 SizeChanged 事件,您需要在屏幕上显示 Window
  • 我在上面测试了我的代码,并确认触发了 SizeChanged 事件。
【解决方案2】:

使用下面的反射你可以成功:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多