首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ApplicationModalAdorner GetLayoutClip() InvalidOperationException

ApplicationModalAdorner GetLayoutClip() InvalidOperationException
EN

Stack Overflow用户
提问于 2017-08-11 15:06:39
回答 1查看 135关注 0票数 0

我有自己的ApplicationModalAdorner。有时我会从GetLayoutClip()得到一个InvalidOperationException,我会覆盖它。对TransformToAncestor的调用会导致异常。我无法重现异常(我在日志中看到了很多异常)。也许这个窗口没有完全渲染?我正在寻找一个复制品(可能在一个简单的应用程序中)和这个异常的原因/解决方案。我在同一分钟内收到了几次异常。我更喜欢没有调度程序的解决方案。

相关的callstack部分:

代码语言:javascript
复制
Wrapped Exception: System.InvalidOperationException: An exception occured while handling another exception;
   bij System.Windows.Media.Visual.TrySimpleTransformToAncestor(Visual ancestor, Boolean inverse, GeneralTransform& generalTransform, Matrix& simpleTransform)
   bij System.Windows.Media.Visual.TransformToAncestor(Visual ancestor)
   bij x.x.x.ApplicationModalAdorner.WindowRect()
   bij x.x.x.ApplicationModalAdorner.GetLayoutClip(Size layoutSlotSize)
   bij System.Windows.UIElement.ensureClip(Size layoutSlotSize)
   bij System.Windows.UIElement.Arrange(Rect finalRect)
   bij System.Windows.Documents.AdornerLayer.ArrangeOverride(Size finalSize)
   bij System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   bij System.Windows.UIElement.Arrange(Rect finalRect)
   bij System.Windows.Documents.AdornerDecorator.ArrangeOverride(Size finalSize)
   bij System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   bij System.Windows.UIElement.Arrange(Rect finalRect)
   bij System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
   bij System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   bij System.Windows.UIElement.Arrange(Rect finalRect)
   bij MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
   bij System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
   bij System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   bij System.Windows.UIElement.Arrange(Rect finalRect)
   bij System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   bij System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   bij System.Windows.UIElement.Arrange(Rect finalRect) 

代码

代码语言:javascript
复制
public class ApplicationModalAdorner : Adorner
{
    private SolidColorBrush _brush;

    private XamDialogWindow Window
    {
        get
        {
            return (XamDialogWindow)AdornedElement;
        }
    }

    private Window MainWindow
    {
        get
        {
            if (Application.Current != null)
            {
                return Application.Current.MainWindow;
            }
            return null;
        }
    }

    public ApplicationModalAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
        _brush = (SolidColorBrush)FindResource("ModalBackgroundBrush");

        Window.Moved += WindowMoved;
        Window.WindowStateChanged += WindowStateChanged;
        MainWindow.SizeChanged += MainWindowSizeChanged;
    }

    // There is no WindowClosed event. Infragistics states that when a window is closed,
    // the WindowStateChanged event gets triggerd and the value will be Hidden. Because 
    // the ApplicationModal windows cannot be hidden, this is a nice way to clean events.
    private void WindowStateChanged(object sender, WindowStateChangedEventArgs e)
    {
        if (e.NewWindowState == Infragistics.Controls.Interactions.WindowState.Hidden)
        {
            Window.Moved -= WindowMoved;
            Window.WindowStateChanged -= WindowStateChanged;
            if (MainWindow != null)
            {
                MainWindow.SizeChanged -= MainWindowSizeChanged;
            }
        }
    }

    private void WindowMoved(object sender, MovedEventArgs e)
    {
        InvalidateVisual();
    }

    private void MainWindowSizeChanged(object sender, SizeChangedEventArgs e)
    {
        InvalidateVisual();
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        drawingContext.DrawRectangle(_brush, null, WindowRect());
        base.OnRender(drawingContext);
    }

    protected override Geometry GetLayoutClip(Size layoutSlotSize)
    {
        var xamDialogWindowRect = new Rect(new Point(Window.Left, Window.Top), layoutSlotSize);
        var geometryGroup = new GeometryGroup();
        geometryGroup.Children.Add(new RectangleGeometry(WindowRect()));
        geometryGroup.Children.Add(new RectangleGeometry(xamDialogWindowRect));
        return geometryGroup;
    }

    private Rect WindowRect()
    {
        var transformToAncestor = Window.TransformToAncestor(MainWindow);
        var topLeft = transformToAncestor.Inverse.Transform(new Point(0, 0));
        var bottomRight = transformToAncestor.Inverse.Transform(new Point(MainWindow.ActualWidth, MainWindow.ActualHeight));
        return new Rect(topLeft, bottomRight);
    }

    public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
    {
        InvalidateVisual();
        return base.GetDesiredTransform(transform);
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2017-11-14 23:23:25

您的窗口不在视觉树中。您有两个选择:

  1. 侦听Loaded事件。然后,在加载时,开始监听其他事件(Moved,WindowStateChanged,SizeChanged).
  2. Use dispatcher,必要时),然后希望发生最好的情况。

至于你对示例应用程序的请求,我可以向你保证,你所看到的问题是难以置信的难以重现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45628978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档