Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net Dispatcher反复触发勾号事件_C#_.net_Dispatchertimer - Fatal编程技术网

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