diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-08-02 14:54:57 -0600 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-08-02 13:54:57 -0700 |
commit | 34048b7bb4e8bf55c712ffd92303cf260c491c0e (patch) | |
tree | 19236fb4e72b8833c87e19fd15d0958b947764fc /Xamarin.Forms.Controls.Issues | |
parent | 08e282350cb3f1c2345125682f14934111af2f9c (diff) | |
download | xamarin-forms-34048b7bb4e8bf55c712ffd92303cf260c491c0e.tar.gz xamarin-forms-34048b7bb4e8bf55c712ffd92303cf260c491c0e.tar.bz2 xamarin-forms-34048b7bb4e8bf55c712ffd92303cf260c491c0e.zip |
Change SourceChanged event on ImageSource to weak event to allow Images (#268)
referencing application-wide StaticResource ImageSources to be GCed
Diffstat (limited to 'Xamarin.Forms.Controls.Issues')
4 files changed, 180 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069.cs new file mode 100644 index 00000000..7abfa5d3 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069.cs @@ -0,0 +1,74 @@ +using System; +using Xamarin.Forms.Controls.Issues; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +namespace Xamarin.Forms.Controls +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 42069, "Garbage Collector can not collect pages that use ImageSource as a StaticResource", + PlatformAffected.All)] + public class Bugzilla42069 : TestNavigationPage + { + protected override void Init() + { + if (Application.Current.Resources == null) + { + Application.Current.Resources = new ResourceDictionary(); + } + + if (!Application.Current.Resources.ContainsKey("SomeSmallImage")) + { + var smallImage = new OnPlatform<ImageSource> { + Android = ImageSource.FromFile("coffee.png"), + WinPhone = ImageSource.FromFile("bank.png"), + iOS = ImageSource.FromFile("coffee.png") + }; + + Application.Current.Resources.Add("SomeSmallImage", smallImage); + } + + const string instructions1 = @"Tap the Start button and follow the instructions on the next page."; + string instructions2 = + $"When you return to this page, tap the Collect button. The message \n'{Bugzilla42069_Page.DestructorMessage}'\n should appear at least once in the debug output."; + + var label1 = new Label { Text = instructions1 }; + var label2 = new Label { Text = instructions2, HorizontalTextAlignment = TextAlignment.Center }; + + var startButton = new Button { Text = "Start" }; + startButton.Clicked += (sender, args) => + { + // We have to do the push-pop-push dance because NavigationPage + // holds a reference to its last page for unrelated reasons; our concern + // here is that the first Bugzilla42069_Page that we pushed gets collected + PushAsync(new Bugzilla42069_Page(), false); + PopAsync(false); + PushAsync(new Bugzilla42069_Page(), false); + }; + + var collectButton = new Button { Text = "Collect" }; + collectButton.Clicked += (sender, args) => + { + GC.Collect(); + GC.Collect(); + GC.Collect(); + }; + + var startPage = new ContentPage + { + Content = new StackLayout + { + Children = + { + label1, + startButton, + label2, + collectButton + } + } + }; + + PushAsync(startPage); + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml new file mode 100644 index 00000000..5f98e198 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8" ?> +<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" + xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" + x:Class="Xamarin.Forms.Controls.Issues.Bugzilla42069_Page"> + <StackLayout> + <Image x:Name="ChangingImage" /> + <Button x:Name="Button2" Text="Change Image"></Button> + <Label Text="Tap the 'Change Image' button; the image at the top should toggle between two images. If the image doesn't toggle, the test has failed." ></Label> + <Label Text="There should be several instances of the same image below." ></Label> + <Button x:Name="Button" Text="Back"></Button> + <Label Text="Tap the 'Back' button." ></Label> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage} "/> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + <Image Source="{StaticResource SomeSmallImage}" /> + </StackLayout> +</ContentPage>
\ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml.cs new file mode 100644 index 00000000..2031e56c --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42069_Page.xaml.cs @@ -0,0 +1,36 @@ +using System; +using System.Diagnostics; +using System.Threading; + +namespace Xamarin.Forms.Controls.Issues +{ + public partial class Bugzilla42069_Page : ContentPage + { + public const string DestructorMessage = ">>>>>>>>>> Bugzilla42069_Page destructor <<<<<<<<<<"; + + public Bugzilla42069_Page() + { + InitializeComponent(); + + ImageWhichChanges = ImageSource.FromFile("oasissmall.jpg") as FileImageSource; + + ChangingImage.SetBinding(Image.SourceProperty, nameof(ImageWhichChanges)); + + Button.Clicked += (sender, args) => Navigation.PopAsync(false); + + Button2.Clicked += (sender, args) => + { + ImageWhichChanges.File = ImageWhichChanges.File == "bank.png" ? "oasissmall.jpg" : "bank.png"; + }; + + BindingContext = this; + } + + ~Bugzilla42069_Page() + { + Debug.WriteLine(DestructorMessage); + } + + public FileImageSource ImageWhichChanges { get; set; } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index 6531b47d..a98b97dc 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -110,6 +110,11 @@ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla40998.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla41205.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla41424.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla42069.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla42069_Page.xaml.cs"> + <DependentUpon>Bugzilla42069_Page.xaml</DependentUpon> + <SubType>Code</SubType> + </Compile> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla42074.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla42075.cs" /> <Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" /> @@ -544,4 +549,10 @@ <Generator>MSBuild:UpdateDesignTimeXaml</Generator> </EmbeddedResource> </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="$(MSBuildThisFileDirectory)Bugzilla42069_Page.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:UpdateDesignTimeXaml</Generator> + </EmbeddedResource> + </ItemGroup> </Project>
\ No newline at end of file |