Обновление: я попробовал это на другом, более чисто установленном компьютере. Я не мог воспроизвести это на этой машине. Если я узнаю, что вызывает оскорбительный компонент (VSStudio), я дам вам знать.
Я создаю некоторые UIElements из кода позади и ожидал сбор мусора, чтобы очистить материал. Тем не менее, объекты не были свободными в то время, когда я ожидал этого. Я ожидал, что они будут освобождены в RemoveAt (0), но они будут освобождены только в конце программы.
Как я могу освободить объекты при удалении из коллекции "Дети" на холсте?
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
MouseDown="Window_MouseDown">
<Grid>
<Canvas x:Name="main" />
</Grid>
</Window>
Код позади:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
GC.Collect(); // This should pick up the control removed at a previous MouseDown
GC.WaitForPendingFinalizers(); // Doesn't help either
if (main.Children.Count == 0)
main.Children.Add(new MyControl() { Background = Brushes.Yellow, Width = 100, Height = 50 });
else
main.Children.RemoveAt(0);
}
}
public class MyControl : UserControl
{
~MyControl()
{
Debug.WriteLine("Goodbye");
}
}