C# 为datagrid中单击的每个按钮初始化计时器
我想在单击特定datagrid行上的按钮时初始化计时器 例如:我有多个带有播放按钮的行,当按下时,我只想在该特定行上启动一个计时器仅,当暂停时,我只想暂停这一个计时器 这是到目前为止的C代码C# 为datagrid中单击的每个按钮初始化计时器,c#,wpf,timer,datagrid,C#,Wpf,Timer,Datagrid,我想在单击特定datagrid行上的按钮时初始化计时器 例如:我有多个带有播放按钮的行,当按下时,我只想在该特定行上启动一个计时器仅,当暂停时,我只想暂停这一个计时器 这是到目前为止的C代码 private void OnPlayButtonClicked(object sender, RoutedEventArgs e) { var selectedProject = ((FrameworkElement) sender).DataContext as Project; if
private void OnPlayButtonClicked(object sender, RoutedEventArgs e)
{
var selectedProject = ((FrameworkElement) sender).DataContext as Project;
if (selectedProject != null)
{
Console.WriteLine("Selected Project has been played: " +
selectedProject.ProjectName + " : Billed Hours - " +
selectedProject.ActualBilledHours);
if (ProjectDictionary.ContainsKey(selectedProject))
{
ProjectDictionary.Remove(selectedProject);
var toggle = IsPlaying = !IsPlaying;
ProjectDictionary.Add(selectedProject, toggle);
foreach(var dict in ProjectDictionary)
{
if (dict.Key == selectedProject)
{
if (toggle)
Timer.Start();
else
Timer.Stop();
}
}
}
}
}
您似乎正在对所有行使用全局计时器。您的问题有点不清楚,但如果您希望每行有一个计时器,例如,您可以在字典中为每个
Project
对象存储一个计时器。大概是这样的:
private readonly Dictionary<Project, Timer> _timers = new Dictionary<Project, Timer>();
private void OnPlayButtonClicked(object sender, RoutedEventArgs e)
{
var selectedProject = ((FrameworkElement)sender).DataContext as Project;
if (selectedProject != null)
{
Console.WriteLine("Selected Project has been played: " +
selectedProject.ProjectName + " : Billed Hours - " +
selectedProject.ActualBilledHours);
if (ProjectDictionary.ContainsKey(selectedProject))
{
ProjectDictionary.Remove(selectedProject);
var toggle = IsPlaying = !IsPlaying;
ProjectDictionary.Add(selectedProject, toggle);
foreach (var dict in ProjectDictionary)
{
if (dict.Key == selectedProject)
{
//get the timer from the dictionary
Timer timer;
if (!_timers.TryGetValue(selectedProject, out timer))
{
timer = new Timer();
_timers.Add(selectedProject, timer);
}
//start or stop
if (toggle)
timer.Start();
else
timer.Stop();
}
}
}
}
}
private readonly Dictionary\u timers=new Dictionary();
私有void OnPlayButtonClicked(对象发送方,路由目标)
{
var selectedProject=((FrameworkElement)sender).DataContext作为项目;
如果(selectedProject!=null)
{
Console.WriteLine(“已播放选定项目:”+
selectedProject.ProjectName+“:计费小时数-+
所选项目。实际计费小时数);
if(ProjectDictionary.ContainsKey(selectedProject))
{
ProjectDictionary.Remove(selectedProject);
var toggle=isplay=!isplay;
添加(选择项目,切换);
foreach(项目字典中的变量dict)
{
if(dict.Key==selectedProject)
{
//从字典中获取计时器
定时器;
if(!\u timers.TryGetValue(selectedProject,out timer))
{
定时器=新定时器();
_timers.Add(selectedProject,timer);
}
//开始还是停止
如果(切换)
timer.Start();
其他的
timer.Stop();
}
}
}
}
}
在这种情况下,发送者不是按钮吗?您是否可以为每行初始化多个计时器,并通过单击的行索引启动/停止特定计时器?使用MVVM很容易,只需将计时器用作模型中的字段,并在播放按钮单击时将其提升,或者,如果MVVM因某种原因无法实现,你可以用一些肮脏的方式来做这件事:在你的ProjectDictionary中,你可以使用元组,甚至可以使用元组。我没有使用你的确切方式,但它给了我一个解决问题的方法,所以谢谢。