C# .net Dispatcher反复触发勾号事件
我的代码中有一个我甚至都不太理解的问题 这是我的项目界面C# .net Dispatcher反复触发勾号事件,c#,.net,dispatchertimer,C#,.net,Dispatchertimer,我的代码中有一个我甚至都不太理解的问题 这是我的项目界面 internal interface IItem { void Show(); event EventHandler Completed; TimeSpan Duration { get; set; } string Name { get; set; } } internal class ItemImage : IItem { public TimeSpan Duration { get; se
internal interface IItem
{
void Show();
event EventHandler Completed;
TimeSpan Duration { get; set; }
string Name { get; set; }
}
internal class ItemImage : IItem
{
public TimeSpan Duration { get; set; }
public string Name { get; set; }
public event EventHandler Completed;
private DispatcherTimer _dt = new DispatcherTimer();
public void Show()
{
_dt.Interval = this.Duration;
_dt.Tick += (s, e) =>
{
_dt.Stop();
Completed(this, new EventArgs());
};
_dt.Start();
}
}
这是我的播放器:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
int _pIndex = 0;
List<IItem> list = new List<IItem>();
private void Button1_Click(object sender, RoutedEventArgs e)
{
list = new List<IItem>()
{
new ItemImage() { Duration = TimeSpan.FromSeconds(5), Name = "Image1" },
new ItemImage() { Duration = TimeSpan.FromSeconds(3), Name = "Image2" },
new ItemImage() { Duration = TimeSpan.FromSeconds(5), Name = "Image3" },
new ItemImage() { Duration = TimeSpan.FromSeconds(7), Name = "Image4" }
};
Next();
}
void Next()
{
var tb = new TextBlock();
tb.Text = ((IItem)list[_pIndex]).Name;
StackPanel1.Children.Add(tb);
list[_pIndex].Completed += (s, e) =>
{
Next();
};
list[_pIndex].Show();
_pIndex++;
_pIndex %= list.Count;
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
int_pIndex=0;
列表=新列表();
私有无效按钮1\u单击(对象发送者,路由目标)
{
列表=新列表()
{
new ItemImage(){Duration=TimeSpan.FromSeconds(5),Name=“Image1”},
new ItemImage(){Duration=TimeSpan.FromSeconds(3),Name=“Image2”},
new ItemImage(){Duration=TimeSpan.FromSeconds(5),Name=“Image3”},
new ItemImage(){Duration=TimeSpan.FromSeconds(7),Name=“Image4”}
};
Next();
}
作废下一页()
{
var tb=新的TextBlock();
tb.Text=((IItem)列表[_pIndex]).Name;
1.儿童。增加(tb);
列表[\u pIndex]。已完成+=(s,e)=>
{
Next();
};
列表[_pIndex].Show();
_pIndex++;
_pIndex%=list.Count;
}
}
第一个列表播放时并没有问题,但在第二个回合,Dispatchermer不会等待我的持续时间值,并立即触发完整事件。我做错了什么?
谢谢。我不知道到底发生了什么(我没有测试),但我看到每次调用
Show()
,另一个事件处理程序都会附加到项目图像
对象中的勾选
。这可能会导致一些副作用,你会经历
您可以将其更改为:
internal class ItemImage : IItem
{
public TimeSpan Duration { get; set; }
public string Name { get; set; }
public event EventHandler Completed;
private DispatcherTimer _dt = new DispatcherTimer();
// constructor
public ItemImage()
{
_dt.Tick += (s, e) =>
{
_dt.Stop();
Completed(this, new EventArgs());
};
}
public void Show()
{
_dt.Interval = this.Duration;
_dt.Start();
}
}
您可以重新创建Dispatchermer
,或移动附加到构造函数的事件。(同上)
这也可以通过list[\u pIndex]在Next()
方法中完成。(它附加到类成员,因此每个buttonclick新处理程序都会添加到列表中。)
您可以重新确定附加事件的样式。比如把它们转移给构造函数
比如:
公共部分类主窗口:窗口
{
int_pIndex=0;
列表=新列表();
公共主窗口()
{
初始化组件();
列表[\u pIndex]。已完成+=(s,e)=>
{
_pIndex++;
_pIndex%=list.Count;
Next();
};
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
列表=新列表()
{
new ItemImage(){Duration=TimeSpan.FromSeconds(5),Name=“Image1”},
new ItemImage(){Duration=TimeSpan.FromSeconds(3),Name=“Image2”},
new ItemImage(){Duration=TimeSpan.FromSeconds(5),Name=“Image3”},
new ItemImage(){Duration=TimeSpan.FromSeconds(7),Name=“Image4”}
};
Next();
}
作废下一页()
{
var tb=新的TextBlock();
tb.Text=((IItem)列表[_pIndex]).Name;
1.儿童。增加(tb);
列表[_pIndex].Show();
}
}
祝你好运。在构造函数中附加事件处理程序工作顺利。谢谢!
public partial class MainWindow : Window
{
int _pIndex = 0;
List<IItem> list = new List<IItem>();
public MainWindow()
{
InitializeComponent();
list[_pIndex].Completed += (s, e) =>
{
_pIndex++;
_pIndex %= list.Count;
Next();
};
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
list = new List<IItem>()
{
new ItemImage() { Duration = TimeSpan.FromSeconds(5), Name = "Image1" },
new ItemImage() { Duration = TimeSpan.FromSeconds(3), Name = "Image2" },
new ItemImage() { Duration = TimeSpan.FromSeconds(5), Name = "Image3" },
new ItemImage() { Duration = TimeSpan.FromSeconds(7), Name = "Image4" }
};
Next();
}
void Next()
{
var tb = new TextBlock();
tb.Text = ((IItem)list[_pIndex]).Name;
StackPanel1.Children.Add(tb);
list[_pIndex].Show();
}
}