2016-05-18 82 views
0

我已經創建了一個看起來這種方式或多或少易類:如何獲得自己班的家長?

public class PreviewItem 
{ 
    public string ItemName { get; set; } 
    public Point PreviewStartingPoint { get; set; } 
    public Point ReleaseStartingPoint { get; set; } 
    public double PreviewWidth { get; set; } 
    public double PreviewHeight { get; set; } 
    public double ReleaseWidth { get; set; } 
    public double ReleaseHeight { get; set; } 
    public Border PreviewBorder { get; set; } 
    public DispatcherTimer ShowTimer { get; set; } 
    public int ShowIndex { get; set; } 
    public List<MarketingItemNode> HandleList { get; set; } 
} 

介於兩者之間。我把這些線:

previewItem.ShowTimer = new DispatcherTimer 
{ 
    Interval = TimeSpan.FromMilliseconds(previewItem.HandleList[0].Duration) 
}; 

previewItem.ShowTimer.Tick += ShowNextItem; 
previewItem.ShowTimer.Start(); 

現在,我已經給了定時器正常蜱事件。當事件觸發時,我想找到發件人的「PreviewItem」。 類似這樣的:

private void ShowNextItem(object sender, EventArgs eventArgs) 
{ 
    DispatcherTimer thisTimer = (DispatcherTimer) sender; 
    PreviewItem thisItem = (PreviewItem) thisTimer.Parent; 
    ... 
} 

但是這個計時器沒有父。我如何在Tick-Event中獲得全班學生?

+0

也許使用'DispatcherTimer.Tag'屬性來存儲父對象? – shadow

+0

所有方法都可行,但要使用標記是最簡單的方法。感謝您的回答。 –

回答

0

也許這樣的事情?

previewItem.ShowTimer = new DispatcherTimer 
      { 
       Interval = TimeSpan.FromMilliseconds(previewItem.HandleList[0].Duration), 
       Tag = previewItem 
      }; 
      previewItem.ShowTimer.Tick += ShowNextItem; 
      previewItem.ShowTimer.Start(); 



private void ShowNextItem(object sender, EventArgs eventArgs) 
    { 
     DispatcherTimer thisTimer = (DispatcherTimer) sender; 
     PreviewItem thisItem = (PreviewItem) thisTimer.Tag; 
     ... 
    } 
1

您可以使用所建議的Tag財產,或子類DispatcherTimer

public class MyDispatcherTimer : DispatcherTimer 
{ 
    public MyDispatcherTimer(PreviewItem parent) 
    { 
     .... 
    } 
} 
1

或者你也可以內嵌的方法:

previewItem.ShowTimer = new DispatcherTimer 
{ 
    Interval = TimeSpan.FromMilliseconds(previewItem.HandleList[0].Duration) 
}; 

previewItem.ShowTimer.Tick += (s, ee) => 
{ 
    // create your logic for the tick event here: 
    previewItem.DoSomething(); 
}; 

previewItem.ShowTimer.Start(); 

但是,如果你需要在課堂上聲明計時器:public DispatcherTimer ShowTimer { get; set; }你最好讓班級照顧計時器本身。

您可以創建一個構造函數來創建計時器。

public class PreviewItem 
{ 
    public string ItemName { get; set; } 
    public Point PreviewStartingPoint { get; set; } 
    public Point ReleaseStartingPoint { get; set; } 
    public double PreviewWidth { get; set; } 
    public double PreviewHeight { get; set; } 
    public double ReleaseWidth { get; set; } 
    public double ReleaseHeight { get; set; } 
    public Border PreviewBorder { get; set; } 
    public DispatcherTimer ShowTimer { get; private set; } // <-- private set 
    public int ShowIndex { get; set; } 
    public List<MarketingItemNode> HandleList { get; set; } 

    public PreviewItem() 
    { 
     ShowTimer = new DispatcherTimer 
     { 
      Interval = TimeSpan.FromMilliseconds(previewItem.HandleList[0].Duration) 
     }; 
     ShowTimer.Tick += ShowNextItem; 
    } 

    private void ShowNextItem(object sender, EventArgs eventArgs) 
    { 
     DispatcherTimer thisTimer = (DispatcherTimer) sender; 
     PreviewItem thisItem = this; // <-- for example, because you're in the object itself... 
     ... 
    } 
} 

這樣使用它:

var myItem = new PreviewItem(); 
myItem.ShowTimer.Start(); 

但是,這意味着每PreviewItem有它自己的定時器(我覺得DispatcherTimer不應該在這個類)

我覺得更好的方法是創建一個一個定時器來照顧所有的實例。 (迭代一個PreviewItem的列表)

+0

剛剛寫下類似的東西。使用內聯處理程序,您可以從處理程序設置的作用域中捕獲所需的任何內容,並將其傳遞到任何您想要的地方。 – spender

+0

這是一個很好的方法,但不是,您確實需要爲每個previewItem創建一個自己的Timer,因爲它們都在不同的時間以不同的內容更改其內容。幾乎不可能只使用一個定時器。 –