소스 검색

Handle detached visuals in dirty list.

Steven Kirk 9 년 전
부모
커밋
74c263ee8f
2개의 변경된 파일16개의 추가작업 그리고 2개의 파일을 삭제
  1. 1 1
      samples/ControlCatalog/MainWindow.xaml.cs
  2. 15 1
      src/Avalonia.Visuals/Rendering/DirtyVisuals.cs

+ 1 - 1
samples/ControlCatalog/MainWindow.xaml.cs

@@ -10,7 +10,7 @@ namespace ControlCatalog
         {
             this.InitializeComponent();
             this.AttachDevTools();
-            //Renderer.DrawDirtyRects = Renderer.DrawFps = true;
+            Renderer.DrawDirtyRects = Renderer.DrawFps = true;
         }
 
         private void InitializeComponent()

+ 15 - 1
src/Avalonia.Visuals/Rendering/DirtyVisuals.cs

@@ -14,7 +14,7 @@ namespace Avalonia.Rendering
 
         public void Add(IVisual visual)
         {
-            var distance = visual.CalculateDistanceFromVisualRoot();
+            var distance = visual.IsAttachedToVisualTree ? visual.CalculateDistanceFromVisualRoot() : -1;
             int existingDistance;
 
             if (_index.TryGetValue(visual, out existingDistance))
@@ -46,6 +46,20 @@ namespace Avalonia.Rendering
             _index.Clear();
         }
 
+        public bool Remove(IVisual visual)
+        {
+            int distance;
+
+            if (_index.TryGetValue(visual, out distance))
+            {
+                _inner[distance].Remove(visual);
+                _index.Remove(visual);
+                return true;
+            }
+
+            return false;
+        }
+
         public IEnumerator<IVisual> GetEnumerator()
         {
             foreach (var i in _inner)