WPF - удаление элемента управления, имеющего DispatcherTimer, похоже, не исчезнет

Я видел вопрос, заданный в 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), так как его таймер продолжает тикать (в этом примере вы можете видеть, что он пишет сообщение в окне вывода), и он продолжает работать в своем событии тика. Какой шаблон мне следует использовать, чтобы по крайней мере заставить таймер переставать тикать, когда элемент управления удален?

6
задан DTig 5 February 2011 в 03:47
поделиться