Skip to content

Commit d287df5

Browse files
committed
Fix memory leak caused by x:Name marked elements
1 parent 701cf35 commit d287df5

2 files changed

Lines changed: 12 additions & 11 deletions

File tree

‎src/SamplesApp/UITests.Shared/Windows_UI_Xaml/FrameworkElementTests/XamlEvent_Leak_UserControl.xaml‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
d:DesignWidth="400">
1111

1212
<Grid>
13-
<Button Content="Button With Handler" Click="Button_Click" />
13+
<!-- A named button with an event must not leak -->
14+
<Button x:Name="namedButton"
15+
Content="Button With Handler"
16+
Click="Button_Click" />
1417
</Grid>
1518
</UserControl>

‎src/Uno.UI/UI/Xaml/NameScope.cs‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,35 @@
22
using System.Collections.Generic;
33
using System.ComponentModel;
44
using System.Text;
5+
using Uno.UI.DataBinding;
56
using Windows.UI.Xaml.Markup;
67

78
namespace Windows.UI.Xaml
89
{
910
[EditorBrowsable(EditorBrowsableState.Never)]
10-
public class NameScope :
11-
Dictionary<string, object>,
12-
INameScope,
13-
IDictionary<string, object>,
14-
ICollection<KeyValuePair<string, object>>,
15-
IEnumerable<KeyValuePair<string, object>>
11+
public class NameScope : INameScope
1612
{
13+
private Dictionary<string, ManagedWeakReference> _names = new Dictionary<string, ManagedWeakReference>();
14+
1715
public NameScope()
1816
{
1917
}
2018

2119
public object FindName(string name)
2220
{
23-
return TryGetValue(name, out var element)
24-
? element
21+
return _names.TryGetValue(name, out var element)
22+
? element.Target
2523
: null;
2624
}
2725

2826
public void RegisterName(string name, object scopedElement)
2927
{
30-
Add(name, scopedElement);
28+
_names.Add(name, WeakReferencePool.RentWeakReference(this, scopedElement));
3129
}
3230

3331
public void UnregisterName(string name)
3432
{
35-
Remove(name);
33+
_names.Remove(name);
3634
}
3735

3836
#region NameScope attached property

0 commit comments

Comments
 (0)