【发布时间】:2023-03-20 06:20:01
【问题描述】:
是否可以使用 dispatchertimer 类,为两个不同的按钮创建两个(或更多)定时器,所以它们会在不同的时间设置闪烁。我已经尝试在我附加的代码中执行此操作,但是,如果两个时间跨度不同,则缺少 accors,这不应该是我正在制作的应用程序。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
using System.Windows.Threading;
namespace UDPReceiveWPF
{
public partial class Form1 : Form
{
bool button_flag = true;
private byte[] dataStream = new byte[1024];
private Socket udpSock;
private byte[] buffer;
private DispatcherTimer dispatcherTimer;
private DispatcherTimer dispatcherTimer2;
private delegate void DisplayMessageDelegate(string message);
private DisplayMessageDelegate displayMessageDelegate = null;
public Form1()
{
InitializeComponent();
this.displayMessageDelegate = new DisplayMessageDelegate(this.DisplayMessage);
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);
dispatcherTimer.Start();
dispatcherTimer2 = new DispatcherTimer();
dispatcherTimer2.Tick += dispatcherTimer2_Tick;
dispatcherTimer2.Interval = new TimeSpan(0, 0, 0, 0, 50);
dispatcherTimer2.Start();
udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSock.Bind(new IPEndPoint(IPAddress.Any, 11000));
buffer = new byte[1024];
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
}
private void DoReceiveFrom(IAsyncResult iar)
{
try
{
Socket recvSock = (Socket)iar.AsyncState;
EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP);
byte[] localMsg = new byte[msgLen];
Array.Copy(buffer, localMsg, msgLen);
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
if (msgLen > 0)
{
string textToprint = Encoding.UTF8.GetString(localMsg, 0, msgLen);
this.Invoke(this.displayMessageDelegate, new object[] { textToprint });
}
}
catch (ObjectDisposedException)
{
}
}
private void DisplayMessage(string messge)
{
textBox1.Text += messge + Environment.NewLine;
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (button_flag)
{
button3.BackColor = Color.White;
//button1.BackColor = Color.Black;
button_flag = false;
}
else
{
button3.BackColor = Color.Black;
//button1.BackColor = Color.White;
button_flag = true;
}
}
private void dispatcherTimer2_Tick(object sender, EventArgs e)
{
if (button_flag)
{
//button3.BackColor = Color.White;
button1.BackColor = Color.Black;
button_flag = false;
}
else
{
//button3.BackColor = Color.Black;
button1.BackColor = Color.White;
button_flag = true;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
或者有没有其他方法可以做到这一点? - 阿斯拉克
【问题讨论】:
-
删除所有内容并在 XAML 中创建动画。
-
在 WPF 中可以做到吗?,这是我应该使用的。
-
@HighCore:它被定义为winforms?
-
@Icepickle OP 声明了 WPF,然后其他人编辑了标题和标签。该代码还使用 WPF 类型,例如
DispatcherTimer。这不是 winforms 代码。
标签: c# winforms visual-studio flicker dispatchertimer