我是一名新手程序员,用C#在MonoDevelop中编写程序,并使用我的gtk MessageDialogs获得一个问题。
我的GTK消息对话框窗口边框上的关闭按钮需要双击才能实际关闭它们。对话的关闭按钮自动工作正常。有人请告诉我如何解决这个问题,代码如下:
if (fchDestination.CurrentFolder == fchTarget.CurrentFolder) {
MessageDialog msdSame = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Close, "Destination directory cannot be the same as the target directory");
msdSame.Title="Error";
if ((ResponseType) msdSame.Run() == ResponseType.Close) {
msdSame.Destroy();
}
return;
}
if (fchTarget.CurrentFolder.StartsWith(fchDestination.CurrentFolder)) {
MessageDialog msdContains = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Close, "error");
msdContains.Title="Error";
if ((ResponseType) msdContains.Run() == ResponseType.Close) {
msdContains.Destroy();
}
return;
}
答案 0 :(得分:5)
单击对话框的“关闭窗口”按钮时给出的响应值不是CLOSE
,而是DELETE_EVENT
。这就是永远不会调用destroy
方法并且对话框徘徊的原因。第二次关闭它(在run
方法的上下文之外),对话框会被正常销毁。
简而言之,您还需要检查ResponseType.DeleteEvent
。
<强>更新强>
在代码中:
MessageDialog msdSame = ...
...
ResponseType response = (ResponseType) msdSame.Run();
if (response == ResponseType.Close || response == ResponseType.DeleteEvent) {
msdSame.Destroy();
}
或者,正如ptomato提到的那样,您不需要检查响应,因为用户只有一个选择:“关闭”。
MessageDialog msdSame = ...
...
msdSame.Run();
msdSame.Destroy();
答案 1 :(得分:0)
可能两个条件都得到满足,因此你得到两个msgbox,看起来你要双击一下来关闭它
答案 2 :(得分:0)
示例类可以是:
using System;
using Gtk;
namespace Visitors.Clases.MessageBox
{
public static class MessageBox
{
public static Gtk.ResponseType Show(Gtk.Window window, Gtk.DialogFlags dialogflags, MessageType msgType,ButtonsType btnType,string Message,String caption)
{
MessageDialog md = new MessageDialog (window,dialogflags,msgType,btnType, Message);
md.Title = caption;
ResponseType tp = (Gtk.ResponseType)md.Run();
md.Destroy();
return tp;
}
}
}
正在使用的课程:
ResponseType result = MessageBox.Show(this,DialogFlags.Modal,MessageType.Error,ButtonsType.Ok,Error,"ERROR");
if (result == Gtk.ResponseType.Yes)
{
MessageBox.Show (this, DialogFlags.Modal, MessageType.Other,ButtonsType.Ok, "YES", "EJEMPLO");
}
else
{
MessageBox.Show (this, DialogFlags.Modal, MessageType.Other,ButtonsType.Ok, "NO", "EJEMPLO");
}