Я видел вопрос, заданный в StackOverflow о том, как правильно удалять элементы управления в WPF.Как правило, есть некоторые комментарии о том, что вы не можете утилизировать их вручную (или не можете), и если у вас нет ссылки на них, они будут в конечном итоге очищены GC.Я совершенно случайно заметил, что один из моих элементов управления, который, как мне показалось, был удален, застрял и все еще выполняет работу, даже если я удалил его из родительского элемента.
Я воссоздал пример как можно меньше строк.Элемент управления имеет DispatcherTimer.Вот код WPF для элемента управления, который я хочу удалить.
public partial class MyControl : UserControl
{
private DispatcherTimer timer;
public MyControl()
{
InitializeComponent();
timer = new DispatcherTimer();
timer.Tick += TimerOnTick;
timer.Interval = TimeSpan.FromSeconds(1);
timer.Start();
}
private void TimerOnTick(object sender, EventArgs args)
{
//this continues to get written out even after this control is removed.
System.Diagnostics.Debug.WriteLine("Tick From MyControl.");
}
}
Вот код для окна, которое добавляет и удаляет мой элемент управления.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void AddClicked(object sender, RoutedEventArgs e)
{
anyControlHolder.Children.Add(new MyControl());
}
private void RemoveClicked(object sender, RoutedEventArgs e)
{
anyControlHolder.Children.Clear();
}
}
Проблема Iу меня, когда я запускаю этот код, а затем динамически добавляю и удаляю пользовательский пользовательский контроль (MyControl), это то, что его таймер продолжает тикать (в этом примере вы можете видеть, как он записывает сообщение в окне вывода), и он продолжает делать работу в своемтик событие.Какой шаблон следует использовать, чтобы хотя бы таймер прекратил тикать при удалении элемента управления?