Sfoglia il codice sorgente

Use ConditionalWeakTable instead of a custom list of (IRenderRoot, RadioButtonGroupManager).

Siegfried Pammer 7 anni fa
parent
commit
739fdc3b9b
1 ha cambiato i file con 5 aggiunte e 30 eliminazioni
  1. 5 30
      src/Avalonia.Controls/RadioButton.cs

+ 5 - 30
src/Avalonia.Controls/RadioButton.cs

@@ -4,6 +4,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using Avalonia.Controls.Primitives;
 using Avalonia.Rendering;
 using Avalonia.VisualTree;
@@ -15,9 +16,9 @@ namespace Avalonia.Controls
         private class RadioButtonGroupManager
         {
             public static readonly RadioButtonGroupManager Default = new RadioButtonGroupManager();
-            static readonly List<(WeakReference<IRenderRoot> Root, RadioButtonGroupManager Manager)> s_registeredVisualRoots
-                = new List<(WeakReference<IRenderRoot> Root, RadioButtonGroupManager Manager)>();
-
+            static readonly ConditionalWeakTable<IRenderRoot, RadioButtonGroupManager> s_registeredVisualRoots
+                = new ConditionalWeakTable<IRenderRoot, RadioButtonGroupManager>();
+            
             readonly Dictionary<string, List<WeakReference<RadioButton>>> s_registeredGroups
                 = new Dictionary<string, List<WeakReference<RadioButton>>>();
 
@@ -25,33 +26,7 @@ namespace Avalonia.Controls
             {
                 if (root == null)
                     return Default;
-                lock (s_registeredVisualRoots)
-                {
-                    int i = 0;
-                    while (i < s_registeredVisualRoots.Count)
-                    {
-                        var item = s_registeredVisualRoots[i].Root;
-                        if (!item.TryGetTarget(out var target))
-                        {
-                            s_registeredVisualRoots.RemoveAt(i);
-                            continue;
-                        }
-                        if (root == target)
-                            break;
-                        i++;
-                    }
-                    RadioButtonGroupManager manager;
-                    if (i >= s_registeredVisualRoots.Count)
-                    {
-                        manager = new RadioButtonGroupManager();
-                        s_registeredVisualRoots.Add((new WeakReference<IRenderRoot>(root), manager));
-                    }
-                    else
-                    {
-                        manager = s_registeredVisualRoots[i].Manager;
-                    }
-                    return manager;
-                }
+                return s_registeredVisualRoots.GetValue(root, key => new RadioButtonGroupManager());
             }
 
             public void Add(RadioButton radioButton)