C#/ MonoDevelop:GTK MessageDialog需要双击才能关闭 - 为什么?

时间:2010-04-06 14:18:42

标签: c# mono gtk

我是一名新手程序员,用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;
  }

3 个答案:

答案 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");
}