如何以编程方式引发 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 的真实 window,并以编程方式更改其宽度或高度。
[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);
我正在尝试在 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 的真实 window,并以编程方式更改其宽度或高度。
[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);