【问题标题】:GTK UI Looks different when running from bundle and when running from Xamarin Studio从 bundle 运行和从 Xamarin Studio 运行时 GTK UI 看起来不同
【发布时间】:2015-11-01 10:07:13
【问题描述】:

我有使用 Mono 框架和用于 UI 的 GTK 的 C# 应用程序。当我从 Xamarin Studio 运行它时,它看起来像这样

我已将 Mono 和 GTK 捆绑到一个独立的包中。从它运行时看起来不同。

哪一个看起来更适合 OSX 平台?如果它是第一个,那么我如何在捆绑的应用程序中获得相同的外观和感觉。

【问题讨论】:

  • 该包只是使用了不同的主题。我不知道您如何配置捆绑包中包含的主题,但应该可以。他们都不是本地人。如果你想看起来很原生,你必须找到一个类似 OS X 的主题(或者切换到使用 Cocoa)。

标签: c# xamarin mono gtk gtk#


【解决方案1】:

GTK 2 主题选项:

  • 使用默认系统主题
  • 每个用户主题通过~/.gtkrc
  • 通过 GTK api 为每个应用程序主题化
  • 通过环境变量为每个应用程序主题化

GTK 2 主题:

在 GTK 2 中,主题是通过资源文件处理的,master 通常名为“gtkrc”。这些资源文件可以是独立的,包括其他资源文件和引用外部图像(图标)等......基于gtkrc的文件的内部内容超出了这里的范围,但是网上有很多参考资料用于 GTK 2.0 资源/主题。

带 GTK 2 的单声道:

OS-X 上的 Mono 安装默认 GTK2 主题 (gtkrc) 和几个替代主题:

位置:/Library/Frameworks/Mono.framework/Versions/4.2.1

find . -name "gtkrc"
./etc/gtk-2.0/gtkrc
./share/themes/bubble/gtk-2.0/gtkrc
./share/themes/Clearlooks/gtk-2.0/gtkrc
./share/themes/Mac/gtk-2.0-key/gtkrc
./share/themes/Quartz/gtk-2.0/gtkrc
./share/themes/Xamarin/gtk-2.0/gtkrc

位于<Mono/Version>/etc/gtk-2.0 中的那个是默认设置(Tango 风格),而另一种选择是“Xamarin”,用于对 Xamarin Studio 进行风格化(内部命名为“Mac Theme for Xamarian”)。

至于控制将哪个主题应用于您的应用程序,您可以允许用户通过基于 .gtkrc 文件的 $HOME 目录来控制它(恕我直言:有多少用户真正知道如何做到这一点,甚至会做什么和支持“专家”最终用户调整 UI 的噩梦,我更喜欢将 UIX 体验锁定为对所有用户都统一的东西,但同样,这只是我的选择。

你应该能够在你的应用启动脚本中设置环境变量GTK2_RC_FILES,但我从来没有这样做过。

注意:环境。变种。 GTK_THEME 在 GTK3 中工作(但 Mono 是 GTK2 绑定的)

通过 GTK api 进行应用主题化:

通过您的应用程序,您可以指定 GTK 使用 Mono 安装的主题之一或您的应用程序提供的主题。

Gtk.Application.Init() 之前,您可以执行以下操作来分配gtkrc 文件:

Gtk.Rc.AddDefaultFile ({gtkrcFile}); 
Gtk.Rc.Parse ({gtkrcFile}); 

如果您有自己的主题,请将文件(gtkrc、其他包含的 gtkrc 文件、图标、图像等)捆绑到您的 .app 中。通常,这些将捆绑在您的捆绑包中的 Contents\Resource directory and use the above code to assign thegtkrc` 中。

对于独立的 exe,我还使用了嵌入式 gtkrc 文件并将其解压缩到一个运行时的 tmp 文件中:

using System;
using System.Reflection;
using System.IO;
using Gtk;

namespace themes
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            InitGlobalResourceFile ();
            Application.Init ();
            MainWindow win = new MainWindow ();
            win.Show ();
            Application.Run ();
        }

        static void InitGlobalResourceFile ()
        { 
            String gtkResouceFile;

            Assembly myAssembly = Assembly.GetExecutingAssembly ();
            string[] names = myAssembly.GetManifestResourceNames ();
            foreach (string name in names) {
                Console.WriteLine (name);
                if (name.Contains ("GtkThemeResource.rc")) {
                    gtkResouceFile = name;
                    break;
                }
                Console.WriteLine ("Gtk Theme Resource not found in manifest");
            }

            var tmpFile = Path.GetTempFileName ();
            var stream = myAssembly.GetManifestResourceStream (gtkResouceFile);
            string gtkrc;
            using (StreamReader reader = new StreamReader (stream)) {
                gtkrc = reader.ReadToEnd ();
            }
            using (StreamWriter outputFile = new StreamWriter (tmpFile)) {
                outputFile.WriteLine (gtkrc);
            }
            Rc.AddDefaultFile (tmpFile); 
            Rc.Parse (tmpFile); 
        }

    }
}

【讨论】:

  • 谢谢。我会检查并回复。
  • 我没有嵌入文件。我只是复制了xamarin主题并将其放在部署目录中并添加了 Gtk.Settings.Default.ThemeName = "Default/gtkrc"; Gtk.Rc.Parse("默认/gtkrc");
  • 我还必须在主题文件中设置 gtk-button-images= 1 以显示图像按钮。GTK 默认情况下在 Xamarin Studio 或部署的应用程序中不显示此内容。以及名为 Mac 的主题有其他格式的 GTK 主题文件。
  • 我已经使用 xamarin 主题和 platypus 创建了包。现在出现了一个新问题。App 包的执行不一致。有时它显示 GUI,有时控制台图标停留那里没有显示 GUI。可能是什么问题?请帮助。
  • 我尝试使用 Gtk.parse 来使用 Xamarin 主题。但应用程序有时无法启动。您能帮帮我吗.. 我卡在这里了。
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多