簡體   English   中英

如何以編程方式引發 SizeChanged 事件

[英]How to programmatically raise SizeChanged event

我正在嘗試在 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。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM