설명서에 따르면 "(FrameworkElement.SizeChanged) ActualHeight 또는 ActualWidth 속성이이 요소의 값을 변경하면 발생합니다."이 코드에서 FrameworkElement.SizeChanged가 발생하지 않는 이유
다음 테스트 메서드를 실행하면 Measureangle 및 Arrange를 호출 한 후 내 Rectangle의 ActualWidth 및 ActualHeight가 업데이트되지만 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가 발생하지 않는지 설명 할 수 있습니까?
제기 할 수 있도록 설정할 수있는 방법이 있습니까? HB의 정적 클래스에서이 테스트를 미끄러
솔루션
패스 : 사각형은 대기 방식으로 일을 수행하는 UI 스레드에 의해 관리되는
[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);
}
}
다만주의해야 할 점은,이 시험이 양식에 매우 안전 보이지 않는, 1 초 타임 아웃이 매우 관대하고 내가 실제 개체를 조작하는 방법을 모르지만 다른 것이 크기 변경의 원인이되는 경우 테스트하려는 것과 다른 변경으로 인해 이벤트가 실행될 때 어느 시점에서 테스트에서 가양 성을 얻을 수 있습니다. –