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

Con*_*nel 3 c# gtk mono

我是一个新手程序员,用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;
  }
Run Code Online (Sandbox Code Playgroud)

Joh*_*gko 5

单击对话框的"关闭窗口"按钮时给出的响应值不是CLOSE,但是DELETE_EVENT.这就是为什么destroy永远不会调用该方法并且对话徘徊的原因.第二次关闭它(超出方法的上下文run)时,对话框会被正常销毁.

简而言之,您还需要检查ResponseType.DeleteEvent.

更新:

在代码中:

MessageDialog msdSame = ...
...
ResponseType response = (ResponseType) msdSame.Run();
if (response == ResponseType.Close || response == ResponseType.DeleteEvent) {
  msdSame.Destroy();
}
Run Code Online (Sandbox Code Playgroud)

或者,正如ptomato提到的那样,您不需要检查响应,考虑到用户只有一个选择:"关闭".

MessageDialog msdSame = ...
...
msdSame.Run();
msdSame.Destroy();
Run Code Online (Sandbox Code Playgroud)

  • 同意解释,但您不需要检查任何`ResponseType`,因为用户唯一的选择是"关闭".只需调用`Run()`然后调用`Destroy()`. (3认同)