我有一个Windows应用程序,它会将一些信息写入卡的Track1和Track2。现在我想要完成的是,当用户点击按钮时,一旦用户刷卡以使消息框消失,消息框就会出现“等待刷卡”。
我尝试使用do while循环但是它不会看到我正在调用的函数
例如:
do{
readcard();
}while (messagebox.show());
这根本不起作用。关于如何实现这一目标的任何建议。
由于
答案 0 :(得分:1)
MessageBox.Show
显示一个消息框并等待用户将其解除。
如果要显示不等待用户但是以编程方式控制的内容,则需要自己编写。在Windows窗体中,您可以使用winforms设计器创建Form
,在实例上调用Show
以显示它,然后Hide
以隐藏它
然而,Windows应用程序和在过去10年或20年内编写的任何应用程序都是事件驱动的,因此如果用户参与其中你不应该使用这样的循环(使用while
)。
退房: http://en.wikipedia.org/wiki/Event-driven_programming http://dotnetfirez.blogspot.com/2010/05/winforms.html https://softwareengineering.stackexchange.com/questions/99842/vs2010-winform-designer-to-learn-or-bottom-up-approach
和谷歌的起点。
答案 1 :(得分:0)
创建一个基本的小尺寸表单。添加标签并在那里输入您的信息。将表格的起始位置属性设为中心
调用表单实例
AutomaticDisappearPopup pop = new AutomaticDisappearPopup();
pop.Show();
WaitSomeTime(pop);
为显示时间定义waitSomeTime方法,然后在不中断主线程的情况下消失
public async void WaitSomeTime(Form item)
{
await Task.Delay(3000);
item.Close();
}
答案 2 :(得分:0)
最近我为 TopMost 消息框创建了一个包装器,它可以在使用 WinForms MessageBox 一段时间后消失(也可用于 WPF)。
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
using MessageBox = System.Windows.Forms.MessageBox;
using Size = System.Drawing.Size;
using System.Runtime.InteropServices;
namespace Views
{
public class TopMostMessageBox
{
const int WM_CLOSE = 0x10;
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
public static DialogResult Show(string message, string title = null, MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon messageBoxIcon = MessageBoxIcon.None, int timeoutSeconds = -1, bool topMost = true )
{
title = title ?? String.Empty;
Form timeoutMessageBox = CreateAutoCloseWindow(timeoutSeconds, topMost);
return MessageBox.Show(timeoutMessageBox, message, title, buttons, messageBoxIcon);
}
private static Form CreateAutoCloseWindow(int timeoutSeconds, bool isTopMost = false)
{
var w = new Form() { Size = new Size(0, 0), TopMost = isTopMost};
int timeoutMs =(timeoutSeconds == -1) ? -1 : (timeoutSeconds*1000);
Task.Delay(timeoutMs).ContinueWith(
t => ControlInvoke(w, () => SendMessage(w.Handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero)));
return w;
}
public static void ControlInvoke(System.Windows.Forms.Control control, Action action) //in case you work with multiple threads
{
try
{
if (control == null || action ==null) return;
if (control.InvokeRequired) control.Invoke(new System.Windows.Forms.MethodInvoker(delegate { action(); }));
else action();
}
catch (Exception e)
{
Debug.WriteLine($"InvokeSelfFixedException: {e}");
}
}
}
}
然后就打电话
TopMostMessageBox.Show("This is TOP_MOST messagebox text", "TOP_MOST title", MessageBoxButtons.OK, MessageBoxIcon.Warning);