【问题标题】:GTK# File Chooser Non Native Look on OSXGTK# 文件选择器在 OSX 上的非原生外观
【发布时间】:2015-10-26 09:03:44
【问题描述】:

我有使用 Mono 框架和 GTK UI 在 Mac 上运行的 C# 应用程序。我对 Filechooser 对话框的外观和感觉有疑问。根据 gtk https://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html 我应该得到这些图标

但我得到的是左侧面板中没有正确图标或驱动器图标的这个。对于驱动器,有一个名为 Volumes 的文件夹,用户需要手动打开它。我认为这不是 Mac 用户所期望的.我发布了2张从网上获得的截图。

我有这个 GTK 版本 (2.2) 与 Mono for Mac 捆绑在一起。我应该怎么做才能获得更原生的外观和感觉?请指教

【问题讨论】:

  • 记录第一个是新的 GTK+ 3 文件选择器对话框;第二个是旧的 GTK+ 2 文件选择器对话框。
  • @andlabs 谢谢。我希望 Mono 能够更新框架中包含的 GTK# 版本。

标签: c# macos mono gtk gtk#


【解决方案1】:

您可以使用较旧的开源 MonoMac 或较新的 Xamarin.Mac 打开 NSOpenPanel 并使用本机 OS-X 文件选择器而不是基于 xplat 的 GTK 2 版本。

只要您记得通过 MonoMac 静态方法 NSApplication.Init() 初始化应用程序,就可以在 GTK# 之上混合 MonoMac 对话框。在应用程序启动的早期执行此操作,但在 GTK# 初始化之后。

至于打开原生 NSOpenPanel,下面是一个 GTK# 按钮点击处理程序中使用的示例:

button.Clicked += (object sender, EventArgs e) => {
    Application.Invoke (delegate {
        var nsOpenPanel = new NSOpenPanel ();
        nsOpenPanel.ReleasedWhenClosed = true;
        nsOpenPanel.Prompt = "Select file";
        var result = nsOpenPanel.RunModal ();
        if (result == 1) {
            button.Label = nsOpenPanel.Url.ToString ();
        }
    });
};

注意:将调用包装在 Application.Invokedelegate 中总是明智的做法,这样一切都在 GTK UI 主线程上执行。

【讨论】:

  • 谢谢。这对于使用 GTK UI 的非 xamarin.mac(Mono.Mac) 应用程序是否可行?
  • 您至少必须使用免费/开源的 MonoMac 版本才能访问 OS-X 原生对话框。在这种情况下不需要获得许可的 Xamarin.Mac...否则您将被绑定到常用的 GTK 对话框,除非您自己在 GTK# 中编写一个完整的打开文件对话框。
  • 我目前正在使用免费的 Mono 版本。
  • NSOpenPanel 是否可以进行多个文件选择和过滤(例如:仅 JPEG)?
  • AllowedFileTypes 属性接受字符串数组,因此您可以根据需要设置任意数量的过滤器。 developer.xamarin.com/api/property/…
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多