Я видел вопрос, заданный в StackOverflow о том, как правильно удалить элементы управления в WPF. Обычно есть некоторые комментарии, как вы не избавляетесь от них вручную (или можете ' t), и до тех пор, пока вы не держите на них ссылку, они в конечном итоге будут удалены сборщиком мусора. Я совершенно случайно заметил, что один из моих элементов управления, который, как мне казалось, я удалил, застрял и продолжает работать, хотя я удалил его из родительского.
Я воссоздал пример в минимальном количестве строк. У элемента управления есть 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();
}
}
Проблема, с которой я сталкиваюсь, когда я запускаю этот код, а затем динамически добавляю и удалите настраиваемый пользовательский элемент управления (MyControl), так как его таймер продолжает тикать (в этом примере вы можете видеть, что он пишет сообщение в окне вывода), и он продолжает работать в своем событии тика. Какой шаблон мне следует использовать, чтобы по крайней мере заставить таймер переставать тикать, когда элемент управления удален?