Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Gtk#对话框放置在Gtk窗口的中心_C#_.net_Mono_Gtk_Gtk# - Fatal编程技术网

C# 将Gtk#对话框放置在Gtk窗口的中心

C# 将Gtk#对话框放置在Gtk窗口的中心,c#,.net,mono,gtk,gtk#,C#,.net,Mono,Gtk,Gtk#,我试图在窗口的中心放置一个GTK对话框,并且我想在这个对话框出现时使父窗口不可编辑。 我尝试设置对话框的parent属性和,并将其位置设置为center on parent(父窗口位置始终居中,父窗口显示居中,但其中一部分位于任务栏下方) 我做错了什么 更新: 我尝试设置transcientfor属性 mywin d = new mywin(); d.Parent = this; d.WindowPosition = WindowPosition.

我试图在窗口的中心放置一个GTK对话框,并且我想在这个对话框出现时使父窗口不可编辑。 我尝试设置对话框的
parent
属性和,并将其位置设置为
center on parent
(父窗口位置始终居中,父窗口显示居中,但其中一部分位于任务栏下方)

我做错了什么

更新:

我尝试设置transcientfor属性

        mywin d = new mywin();
        d.Parent = this;
        d.WindowPosition = WindowPosition.CenterOnParent; 
        d.TransientFor = this; 
        d.WidthRequest = 360;
        d.HeightRequest =260;
        d.Resizable = false; 
        d.Show (); 
当我执行此操作时,在应用程序输出中也会出现此错误

(myapp:5844): Gtk-WARNING **: Can't set a parent on a toplevel widget

(myapp:5844): Gdk-CRITICAL **: inner_clipboard_window_procedure: assertion 'success' failed
更新: 从父级调用对话框

protected void OnButton7Clicked (object sender, EventArgs e)
    {
            var mydiag = new mydiag( this );

            if ( ( (Gtk.ResponseType) mydiag.Run() ) == Gtk.ResponseType.Ok ) {
                // do whatever here...
            }
     }
对话框代码

using System;

namespace myproj
{
    public partial class mydiag : Gtk.Dialog
    {
        public mydiag (Gtk.Window parent)
        {
            this.Build ();
            this.Title = parent.Title + " more info";
            this.Icon = parent.Icon;
            this.Parent = parent;
            this.TransientFor = parent;
            this.SetPosition( Gtk.WindowPosition.CenterOnParent );
            this.ShowAll();
        }
    }
}

此处报告了该问题:

(myapp:5844): Gtk-WARNING **: Can't set a parent on a toplevel widget
您的mywin类不是一个Gtk.Dialog,而是一个Gtk.Window。您应该通过以下方式创建主窗口:

namespace Whatever {
    public class MainWindow: Gtk.Window {
        public MainWindow()
            : base( Gtk.WindowType.Toplevel )
        {
            this.Title = "Gtk# App";
            this.Build();
        }

        private void Build() {
            // create your widgets
        }

        // more things...
}
假设现在您需要为应用程序中的某些功能打开一个对话框

namespace Whatever {
    public class MainWindow: Gtk.Window {
        // ...more things
        private void OnWhatever() {
            var dlg = new DlgMoreInfo( this );

            if ( ( (Gtk.ResponseType) dlg.Run() ) == Gtk.ResponseType.Ok ) {
                // do whatever here...
            }

            dlg.Destroy();
        }
    }
}
最后,您需要创建对话框DlgMoreInfocentered等

namespace Whatever {
    public class DlgMoreInfo : Gtk.Dialog {
        public DlgMoreInfo(Gtk.Window parent) {
            this.Build();

            this.Title = parent.Title + " more info";
            this.Icon = parent.Icon;
            this.TransientFor = parent;
            this.SetPosition( Gtk.WindowPosition.CenterOnParent );
            this.ShowAll();
        }

        private void Build() {
            // Create widgets here...
            // Buttons
            this.AddButton( Gtk.Stock.Cancel, Gtk.ResponseType.Cancel );
            this.AddButton( Gtk.Stock.Ok, Gtk.ResponseType.Ok );
            this.DefaultResponse = Gtk.ResponseType.Ok;
        }
    }
}
您只能创建作为顶级窗口子窗口的对话框;任何一扇窗户都不可能是另一扇窗户的孩子

请注意,此代码未使用Xamarin Studio的设计器。如果使用设计器,则在ShowAll()之前调用HideAll(),如果需要使用小部件,或者在调用SetPosition()之后将调用移动到Build()


希望这能有所帮助。

您是否为家长将对话框设置为
transient\u?(如果您将父项作为
parent
参数传递给一个标准的GtkDialog构造函数,那么是的。)@andlabs我也尝试过。请查看更新。
GtkWidget
parent
属性完全不同;它与
GtkContainer
有关。摆脱那条线。您使用的是什么操作系统和窗口管理器?@andlabs我现在使用的是windows。但是这个应用程序是针对Mac的,这对windows的管理有什么影响吗?我不知道我使用的是什么窗口管理器。我只是使用Xamarin Studio(Mono+Gtk)谢谢。。这确实是一个窗口。实际上我之前有一个对话。。我替换了它,所以感到很困惑。现在我已经将类更改为dialog>“public partial class mywin:Gtk.dialog”<。我无法更改UI。是否有任何方法可以保留现有UI并将其显示为对话框。我猜您正在使用Xamarin Studio。以常规方式创建新对话框,并复制/粘贴组件。无论如何,我的建议是摆脱设计师。是的,我使用的是Xamarin Studio。我如何复制粘贴组件?正常复印行吗?当我将类更改为dialog时,对话框中没有任何小部件是空的(执行时)。此外,设计师在新对话框中默认设置了一些按钮,我无法删除这些按钮。。所以我切换到窗口。有没有一种方法可以让窗口像对话框一样。我只希望它居中。正常复制就可以了。很抱歉,我不知道如何将窗口置于其父窗口的中心,因为windows没有这样的概念。我只能再次推荐你摆脱这个设计师。手动编码布局,如果不添加按钮,对话框中就不会有按钮。检查:我尝试添加您在新创建的对话框中提供的代码。当对话框显示时,主窗口是不可编辑的。但是对话框不是以父窗口为中心的。