2016-05-18 5 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(); 

Теперь я дал таймер нормальный Tick-Event. Когда событие срабатывает, я хочу найти «PreviewItem» отправителем. Что-то вроде этого:

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

Но thisTimer не имеет родителя. Как я могу получить весь класс внутри Tick-Event?

+0

Возможно, с помощью свойства 'DispatcherTimer.Tag' для хранения родителя? – shadow

+0

Все методы работают, но использовать тег ist самый простой метод. Спасибо за ваши ответы. –

ответ

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 s)

+0

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

+0

То есть хороший подход, но нет, вам действительно нужно, чтобы каждый PreviewItem создал собственный таймер, потому что все они меняют свой контент в разное время с различным содержимым. Его почти невозможно использовать только один таймер. –

Смежные вопросы