2009-08-29 16 views
0

こんにちは、ユーザーがボタンをクリックするたびに(デモ用のコントロールの例)、XAMLで定義されたスタックパネルに追加するたびに2つのテキストボックスを含むリストボックスを作成しています。WPF +動的コントロール+アクティビティタイマーイベント

<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)関連付けられたタイマーをリセットするために、リストビューとその中の他のコントロールのイベントをどのように監視しますか?

私はこれがすべて意味を持ち、誰かが私のためにいくつかの指針を持っていることを願っています。

ありがとうございました。

答えて

0

どのように各リストビューにタイマーを付けますか?

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 
} 

、私はあなたの代わりにビューで直接、すべてをやろうとしているのビューモデルにすべてこのロジックをカプセル化するお勧めします。

+0

ありがとうございました。私はDispatcherTimerが必要でした。 私はまだリストビューの命名について少し不明です。 この例では、新しい名前が追加されるたびに「anotherLv」という名前が付けられています。 コントロールに動的に名前を付けて、リストビューを辞書に追加する前に "anotherLv" + timestampなので、tickイベントでコントロールを区別することができます。 私が何を求めているかは、ResetTimerイベントで正しいリストビューをどのように参照するかということです.Texboxの異なるセットに配線されたすべてのTextChangedイベントが同じメソッドを呼び出すためです。 –

+0

OK、多分辞書をスワップしてください。つまり、DispatcherTimerを対応するListViewItemにマップします。イベントハンドラでは、DispatcherTimerが送信側の引数なので、対応するListViewItemをルックアップすることができます。 –