Browse Source

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

pull/1827/head
Siegfried Pammer 8 years ago
parent
commit
739fdc3b9b
  1. 35
      src/Avalonia.Controls/RadioButton.cs

35
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)

Loading…
Cancel
Save