如何获取自己的 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
的列表)
我创建了一个或多或少简单的 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
的列表)