[英]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.