WPF + динамические элементы управления + события таймера активности

Привет, я создаю список, содержащий 2 текстовых поля каждый раз, когда пользователь нажимает кнопку (пример элементов управления для демонстрации), и добавляю их в панель стека, определенную в XAML.

<StackPanel Name="myStackPanel">
    <Button Name="myButton" Click="myButton_Click">Click to add a new button</Button>
</StackPanel> 

    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        TextBox tb = new TextBox();
        TextBox tb2 = new TextBox();

        tb.Text = "Some text 1";
        tb2.Text = "Some text 2";

        ListView lv = new ListView();
        lv.Name = "anotherLv";
        lv.Items.Add(tb);
        lv.Items.Add(tb2);

        this.myStackPanel.Children.Add(lv);
    }

Это прекрасно работает.

Мне нужна возможность запускать таймер при создании каждого списка, который будет отсчитывать от 5 минут до 0. Как только таймер достигнет 0, список, связанный с этим таймером, будет удален с экрана. Таймер нужно будет сбрасывать обратно на 5 минут каждый раз, когда в соответствующем списке происходит какая-либо активность (т. е. вводится какой-либо текст или происходит наведение курсора мыши).

Поскольку у пользователя есть возможность создавать любое количество этих списков, мне нужно будет создать отдельный таймер для каждого созданного списка, а затем отслеживать события для этого конкретного списка и содержащихся элементов управления.

У меня есть несколько моментов, с которыми я не могу начать работу.

1) Как мне прикрепить таймер к каждому списку?
2) Как я буду отслеживать события для каждый список и другие элементы управления внутри него, чтобы сбросить соответствующий таймер?

Я надеюсь, что все это имеет смысл, и кто-то может мне подсказать.

Спасибо.


person Community    schedule 29.08.2009    source источник


Ответы (1)


Как мне прикрепить таймер к каждому списку?

Вы можете хранить таймеры в файле Dictionary<ListViewItem, DispatcherTimer>. То есть карта от ListViewItem до связанного DispatcherTimer.

Как я буду отслеживать события для каждого списка и других элементов управления в нем, чтобы сбросить соответствующий таймер?

Вы создаете элементы, поэтому можете прикреплять обработчики событий в соответствии с вашими требованиями. Например:

ListView lv = new ListView();
lv.Name = "anotherLv";
lv.Items.Add(tb);
lv.Items.Add(tb2);

tb.TextChanged += ResetTimer;
tb2.TextChanged += ResetTimer;

private void ResetTimer(object sender, RoutedEventArgs e)
{
    //reset timer here
}

Тем не менее, я бы рекомендовал вам инкапсулировать всю эту логику в модели представления вместо того, чтобы пытаться делать все непосредственно в представлении.

person Kent Boogaart    schedule 29.08.2009
comment
Спасибо, Кент, именно то, что мне нужно, DispatcherTimer. Я все еще немного не понимаю, как называть список. В примере мы называем его «anotherLv» каждый раз, когда добавляется новый. Должен ли я динамически называть элемент управления «anotherLv» + временная метка перед добавлением списка в словарь, чтобы в событии тика я мог различать элементы управления. Я предполагаю, что я спрашиваю, как я буду ссылаться на правильное представление списка в событии ResetTimer, поскольку все события TextChanged, подключенные к различным наборам тексбоксов, будут вызывать один и тот же метод. - person ; 30.08.2009
comment
Ладно, может, поменяем словарь местами. Другими словами, сопоставьте DispatcherTimer с соответствующими элементами ListViewItem. Таким образом, в вашем обработчике событий DispatcherTimer является аргументом отправителя, поэтому вы можете использовать его для поиска соответствующего элемента ListViewItem. - person Kent Boogaart; 30.08.2009