6
선택 효과를 그리는 데 사용되는 사용자 지정 패널이 있습니다. 하지만 때로는 이전 사각형을 지우지 않습니다. 마우스가 화면이 충분히 커지면 앞뒤로 움직이면 (두 모니터에서) WPF 버그 또는 제한입니까? 이 문제를 해결하는 방법을 알고 있습니까? 미리 감사드립니다.WPF UIElement 새로 고침 버그?
단순화 된 코드는 다음
public class CustomPanel : Panel
{
private Rectangle _rectangle;
public CustomPanel()
{
this._rectangle = new Rectangle();
this._rectangle.StrokeThickness = 3;
this._rectangle.Stroke = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)); ;
this.Children.Add(this._rectangle);
}
protected override Size MeasureOverride(Size availableSize)
{
this._rectangle.Measure(availableSize);
return this._rectangle.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!finalSize.IsEmpty)
{
this._rectangle.Arrange(new Rect(new Point(0, 0), finalSize));
}
return finalSize;
}
}
처럼 보인다 나는이
void OnMouseMove(object sender, MouseEventArgs e)
{
var point = e.GetPosition(this);
var size = new Size(point.X>=0? point.X:0, point.Y>=0? point.Y:0);
this.Selection.Measure(size);
this.Selection.Arrange(new Rect(size));
}
처럼 그리드에 넣어 마우스를 이동하는 동안 그것을 무효화하고 결과는 다음 그림 처럼 보인다
선택의 폭은 무엇입니까? – gliderkite
그 사각형은 선택 테두리를 그리는 데 사용됩니다. 우리는 매우 복잡한 컨트롤을 가지고 있으며 위의 코드를 사용하여 선택 테두리를 그리는 것이 합리적입니까? – Hiber
두 가지 코드 냄새가 나는데 : mousemove가 기본 구현을 호출하지 않고 mousemove가 레이아웃을 무효화하는 wpf 메소드 중 하나가되지 않아야합니다. 선택을 변경 한 후 mousemove에서 수동으로 레이아웃을 무효화하십시오. (InvalidateVisual()) –