【问题标题】:Position one window on top of another using MonoDevelop and GTK#, C#使用 MonoDevelop 和 GTK#、C# 将一个窗口置于另一个窗口之上
【发布时间】:2017-09-01 06:22:10
【问题描述】:

我想知道是否有人可以帮助我我是 GTK# 和 MonoDevelop 的新手,我似乎不知道如何在另一个窗口前面放置一个启动窗口。当启动窗口加载时,它位于屏幕的右侧,主窗口位于中心,我希望它们都位于中心。我曾经使用 GUI builder 并确保两者在 Designer->Properties 中都有一个中心位置

主窗口

public partial class MainWindow: Gtk.Window
{
   public MainWindow () : base (Gtk.WindowType.Toplevel)
   {
      Build ();
   }

   protected void OnDeleteEvent (object sender, DeleteEventArgs a)
   {
      Application.Quit ();
      a.RetVal = true;
   }
}

闪屏窗口

public partial class SplashScreenWindow : Gtk.Window
{
    public SplashScreenWindow () :
        base (Gtk.WindowType.Toplevel)
    {
        this.Build ();
    }
}

主要显示和隐藏启动窗口

    public static void Main (string[] args)
    {
        Application.Init ();
        SplashScreenWindow s = new SplashScreenWindow ();
        s.Title = @"I am a Splash Screen";
        MainWindow win = new MainWindow ( );
        System.Threading.Thread.Sleep (1000);
        win.Title = @"I am a Menu";
        win.Visible = false;
        s.Show ();
        s.Visible = false;
        s.Dispose ();

        win.Show ();
        Application.Run ();
    }
}

【问题讨论】:

    标签: c# .net xamarin monodevelop gtk#


    【解决方案1】:

    通过GdkWindow.Screen 获取主屏幕的大小(宽度/高度),并在窗口上执行Move,将移动调整一半大小。

    示例:

    MainWindow win = new MainWindow();
    var screen = win.GdkWindow.Screen;
    win.GdkWindow.GetSize(out var winWidth, out var winHeight);
    win.Move((screen.Width / 2) - (winWidth / 2), (screen.Height / 2) - (winHeight / 2));
    Application.Run();
    win.Show();
    

    【讨论】:

      【解决方案2】:

      最后这对我来说效果最好

      public SplashWindow()
          : base(Gtk.WindowType.Toplevel)
      {
          this.Build();
          this.SetDefaultSize(250, 250);
          this.SetPosition(WindowPosition.Center);
      
          ThreadStart tStart = new ThreadStart(this.EndSplash);
          Thread t = new Thread(tStart);
          t.Start();
          Build();
      }
      
      public void EndSplash()
      {
          Thread.Sleep(1000);
          Gtk.Application.Invoke(
              delegate (object sender, EventArgs args)
              {
                  StartApplication();
              }
          );
      }
      
      private void StartApplication()
      {
          this.Destroy();
          FSD.WelcomeWindow welcome = new FSD.WelcomeWindow();
          welcome.Show();
      
      }
      

      然后在 Main

      class MainClass
      {
          public static void Main(string[] args)
          {
              Application.Init();
              SplashWindow splash = new SplashWindow();
              splash.Show();
              Application.Run();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多