summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55365.cs
blob: 1ab99a2ed0f0867e63791203c0eb366cf9f37f38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;
#if UITEST
using NUnit.Framework;

#endif

namespace Xamarin.Forms.Controls.Issues
{
	[Preserve(AllMembers = true)]
	[Issue(IssueTracker.Bugzilla, 55365, "~VisualElement crashes with System.Runtime.InteropServices.COMException", PlatformAffected.UWP)]
	public class Bugzilla55365 : TestContentPage
	{
		readonly StackLayout _itemsPanel = new StackLayout();
		readonly DataTemplate _itemTemplate = new DataTemplate(CreateBoxView);
		readonly StackLayout _layout = new StackLayout();

#if UITEST
		[Test]
		public void ForcingGCDoesNotCrash()
		{
			RunningApp.WaitForElement("Clear");
			RunningApp.Tap("Clear");
			RunningApp.Tap("Garbage");
			RunningApp.WaitForElement("Success");
		}
#endif

		protected override void Init()
		{
			var viewModel = new ObservableCollection<_55365Item>
			{
				new _55365Item { Subject = 65 }
			};

			viewModel.CollectionChanged += OnCollectionChanged;

			_itemsPanel.BindingContext = viewModel;

			foreach (_55365Item item in viewModel)
			{
				_itemTemplate.SetValue(BindingContextProperty, item);
				var view = (View)_itemTemplate.CreateContent();
				_itemsPanel.Children.Add(view);
			}

			var clearButton = new Button { Text = "Clear", Command = new Command(o => viewModel.Clear()) };
			_layout.Children.Add(clearButton);

			var collectButton = new Button { Text = "Garbage", Command = new Command(o =>
			{
				GC.Collect();
				GC.WaitForPendingFinalizers();
				_layout.Children.Add(new Label {Text = "Success"});
			}) };
			_layout.Children.Add(collectButton);
			_layout.Children.Add(_itemsPanel);

			Content = _layout;
		}

		static object CreateBoxView()
		{
			var boxView1 = new BoxView { HeightRequest = 100, Color = new Color(0.55, 0.23, 0.147) };
			var setter1 = new Setter { Property = BoxView.ColorProperty, Value = "#FF2879DD" };
			var trigger1 = new DataTrigger(typeof(BoxView)) { Binding = new Binding("Subject"), Value = 65 };
			trigger1.Setters.Add(setter1);
			boxView1.Triggers.Add(trigger1);
			return boxView1;
		}

		void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
		{
			if (e.Action == NotifyCollectionChangedAction.Reset)
			{
				// reset the list
				_itemsPanel.Children.Clear();
			}
		}

		[Preserve(AllMembers = true)]
		public class _55365Item
		{
			public int Subject { get; set; }
		}
	}
}