【问题标题】:gtk# thread for windowgtk# 窗口线程
【发布时间】:2013-10-31 18:39:13
【问题描述】:

我正在使用 C# 和 gtk# 构建一个 GUI 应用程序。我最近遇到了一个问题,正在寻找解决这个问题的最佳方法:

我有一个弹出的模式窗口供用户输入数字。这个窗口是从我的主窗口访问的一个单独的窗口,它的设置如下:

    public class MainWindow()
    {
        public NumberEntry numEntry;

每当我需要用户输入数字时,我都会在 NumberEntry 的公共 Window 属性上调用 ShowAll(),例如:

    numEntry.win.ShowAll();

所有这一切都很好。之后,为了获取他们输入的值,我调用:

    int entered = numEntry.valueEntered;

问题显然是代码在 ShowAll() 行完成后立即继续执行,并且 numEntry.valueEntered 始终为 0。我想做的(并且一直在尝试做的)是暂停 main线程,并在第二个线程中打开数字输入窗口,并在完成后加入主线程。当我尝试打开数字输入窗口时,暂停主线程似乎可以防止 GUI 更改导致程序冻结。如果可能的话,我还想避免使用回调方法,因为这会在一段时间后变得相当复杂。有什么建议吗?谢谢!

【问题讨论】:

  • ShowDialog 并返回 valueEntered as ModalResult?
  • 嗯... ShowDialog 没有返回值:(
  • 窗口比标准对话框更复杂(就像一个计算器,上面有 16 个按钮)您可以制作自定义对话框还是仅限于标准的取消、确定等?
  • 或者某种将窗口作为模态对话框运行的解决方案......不过,对于这些东西来说,一般来说似乎没有太多文档。
  • 原来 Dialog 是非常可编辑的,而且由于它的父类是 Window,所以它很容易。每当它让我回答我自己的问题时,我都会发布一个示例。

标签: c# multithreading mono gtk#


【解决方案1】:

似乎当 GTK 窗口关闭时,它的所有子控件都被清除了。因此,要从自定义对话框窗口中获取结果,您可以执行以下操作(我不是 gtk 大师,但它对我有用):

1.使用您的控件创建一个新的对话框窗口(我使用了 Xamarin 工作室)。添加结果属性、OK 和 Cancel 处理程序并覆盖 OnDeleteEvent 方法:

public partial class MyDialog : Gtk.Dialog
{

    public string Results {
        get;
        private set;
    }

    public MyDialog ()
    {
        this.Build ();
    }

    protected override bool OnDeleteEvent (Gdk.Event evnt)
    {
        Results = entry2.Text; // if user pressed on X button..
        return base.OnDeleteEvent (evnt);
    }

    protected void OnButtonOkClicked (object sender, EventArgs e)
    {
        Results = entry2.Text;
        Destroy ();
    }

    protected void OnButtonCancelClicked (object sender, EventArgs e)
    {
        Results = string.Empty;
        Destroy ();
    }
}

2。在您的主窗口中创建一个对话框对象并将您的事件处理程序附加到其 Destroyed 事件:

protected void OnButtonClicked (object sender, EventArgs e)
{
    var dialog = new MyDialog ();
    dialog.Destroyed += HandleClose;
}

3.对话框关闭时获取结果:

void HandleClose (object sender, EventArgs e)
{
    var dialog = sender as MyDialog;
    var textResult = dialog.Results;
}

如果您愿意,还可以指定对话结果属性等。

【讨论】:

  • 是的,我打算自己用类似的东西来回答它。你和我最终做的很接近,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多