2010-04-06 74 views
3

我是一位新手程序员,他在C#中的MonoDevelop中编写了一个程序,并且带有我的gtk MessageDialogs。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; 
    } 

回答

4

单击对话框的“关闭窗口”按钮时给出的响应值不是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(); 
+3

同意解释,但你不需要检查任何'ResponseType',因为用户的唯一选择是“Cl OSE”。只需调用'Run()'然后'Destroy()'。 – ptomato 2010-04-07 08:01:40

+0

我尝试了下面的代码,但仍然得到错误:s我在哪里出错了?感谢您的帮助:) \t \t \t \t MessageDialog msdSame = new MessageDialog(this,DialogFlags.Modal,MessageType.Error,ButtonsType.Close,“你不能同步两个相同的文件夹”); \t \t \t msdSame.Title =“Error”; \t \t \t //如果用户点击关闭,然后关闭消息框 \t \t \t如果((的responseType)msdSame.Run()== ResponseType.Close ||(的responseType)msdSame.Run()== ResponseType.DeleteEvent){ \t \t \t \t msdSame.Destroy(); \t \t \t} – Connel 2010-04-07 23:40:39

+0

嗨ptomato抱歉,没有看到您的评论!我有点新编程:我需要调用run()并在代码中销毁吗?谢谢 – Connel 2010-04-07 23:43:52

0

可能是双方的条件得到满意的,因此你得到两个MSGBOX,看来你已经给双击关闭它

+0

嗯,但是当我上的关闭按钮点击MSGBOX自身的窗口关闭,立竿见影,它只有在msgboxes窗口装饰上的关闭按钮是一个问题:S为什么我这么混淆 – Connel 2010-04-06 15:55:48

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"); 
} 
相关问题