gpt4 book ai didi

wpf - 为什么此代码中没有引发 FrameworkElement.SizeChanged

转载 作者:行者123 更新时间:2023-12-02 19:28:01 24 4
gpt4 key购买 nike

根据文档“(FrameworkElement.SizeChanged) 当此元素上的 ActualHeight 或 ActualWidth 属性值更改时发生。”

运行以下测试方法,我的矩形的 ActualWidth 和 ActualHeight 在调用 Measure 和 Arrange 后更新,但从未引发 SizeChanged RoutedEvent。

    [Test]
[RequiresSTA]
public void Test_Something()
{
bool sizeChangedRaised = false;

var r = new Rectangle { Width = 10, Height = 10 };
r.Measure(new Size(20, 20));
r.Arrange(new Rect(0, 0, 20, 20));

//r.ActualWidth and r.ActualHeight are both 10 at this point.

r.SizeChanged += (s, e) => sizeChangedRaised = true;

r.Width = 5;
r.Height = 5;
r.Measure(new Size(20, 20));
r.Arrange(new Rect(0, 0, 20, 20));

//r.ActualWidth and r.ActualHeight are now both 5.

Assert.That(sizeChangedRaised);// false
}

谁能解释一下为什么 SizeChanged 没有被引发?
有什么方法可以设置它以使其升高吗?

<小时/>

解决方案

此测试通过了 H.B. 的静态类:

   [Test]
[RequiresSTA]
public void Test_Something()
{
bool sizeChangedRaised = false;
var r = new Rectangle { Width = 10, Height = 10 };
r.Measure(new Size(20, 20));
r.Arrange(new Rect(0, 0, 20, 20));
r.SizeChanged += (s, e) => {
sizeChangedRaised = true;
};
r.Width = 5;
r.Height = 5;
r.Measure(new Size(20, 20));
r.Arrange(new Rect(0, 0, 20, 20));
ThreadEx.Wait(1000);
Assert.That(sizeChangedRaised);

}

static class ThreadEx
{
public static void Wait(int millisecondsTimeout)
{
Wait(TimeSpan.FromMilliseconds(millisecondsTimeout));
}

public static void Wait(TimeSpan timeout)
{
var frame = new DispatcherFrame();
new Thread(() =>
{
Thread.Sleep(timeout);
frame.Continue = false;
}).Start();
Dispatcher.PushFrame(frame);
}
}

最佳答案

矩形由 UI 线程管理,它以排队方式执行操作,如果您只是设置断点或显示 MessageBox,则 SizeChanged 在执行完整方法后很长时间内会触发设置一个 bool 值时,你会看到它确实被触发了。

编辑:我将如何测试它;只需提前添加一些延迟即可:

ThreadEx.Wait(1000);
Assert.That(sizeChangedRaised);
static class ThreadEx
{
public static void Wait(int millisecondsTimeout)
{
Wait(TimeSpan.FromMilliseconds(millisecondsTimeout));
}

public static void Wait(TimeSpan timeout)
{
var frame = new DispatcherFrame();
new Thread((ThreadStart)(() =>
{
Thread.Sleep(timeout);
frame.Continue = false;
})).Start();
Dispatcher.PushFrame(frame);
}
}

关于wpf - 为什么此代码中没有引发 FrameworkElement.SizeChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6851817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com