WPF + динамическое управление + события таймера активности - PullRequest
0 голосов
/ 29 августа 2009

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

Надеюсь, все это имеет смысл, и у меня есть несколько указателей для меня.

Спасибо.

1 Ответ

0 голосов
/ 29 августа 2009

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

Вы можете хранить таймеры в 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
}

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

...