如何获取自己的 class 的 Parent?

How to get the Parent of own class?

我创建了一个或多或少简单的 class,看起来是这样的:

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;
    ...
}

但是thisTimer没有Parent。如何在 Tick-Event 中获取整个 class?

也许是这样的?

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;
        ...
    }

您可以按照建议使用 Tag 属性 或子类 DispatcherTimer:

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

或者您可以内联方法:

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();

但是,如果您需要在 class 中声明计时器:public DispatcherTimer ShowTimer { get; set; } 您最好让 class 自行处理计时器。

您可以创建一个构造函数来创建计时器。

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 不应该在这个 class 中)

我认为更好的方法是创建一个 计时器来处理所有实例。 (迭代 PreviewItem 的列表)