我正在尝试使用C#,Linux上的单声道/ GTK#和Windows上的.NET/GTK#创建跨平台C#应用程序,但是在两个平台下启动顺序似乎需要略有不同:
在Linux下:
public static void Main (string[] args)
{
Gdk.Threads.Init ();
// etc...
Run Code Online (Sandbox Code Playgroud)
在Windows下:
public static void Main (string[] args)
{
Glib.Thread.Init ();
Gdk.Threads.Init ();
// etc...
Run Code Online (Sandbox Code Playgroud)
两者都要求以这种方式完成:Windows抱怨g_thread_init()没有使用linux代码调用,并且linux抱怨已经使用Windows代码调用它.除此之外,这一切都非常有效.
我对"解决方案"的第一次尝试看起来像:
public static void Main (string[] args)
{
try {
Gdk.Threads.Init ();
} catch (Exception) {
GLib.Thread.Init ();
Gdk.Threads.Init ();
}
// etc...
Run Code Online (Sandbox Code Playgroud)
但即便是这个凌乱的解决方案也行不通; 错误来自GTK +,非托管代码,因此无法捕获.有没有人对问题的原因有什么好主意,以及如何解决它?或者,如果不这样做,有关于如何检测应在运行时调用哪一个的明智想法?
我在Windows上使用MonoDevelop开发C#应用程序,发现我喜欢使用GTK#而不是winforms.但是,据我所知,到目前为止,您无法将GTK#运行时嵌入到应用程序中.问题是我宁愿不要求我正在努力的应用程序的最终用户必须单独安装GTK#这对于像我这样的极客来说很好,但该应用程序适用于非极客用户我希望安装几乎是一键操作.有任何想法吗?
我正在使用GTK Sharp为我的应用程序处理一些GUI.
看看这段代码:
Pango.FontDescription fontdesc = new Pango.FontDescription();
fontdesc.Family = "Sans";
//fontdesc.Size = 12;
fontdesc.Weight = Pango.Weight.Semibold;
SyncInfo.ModifyFont(fontdesc);
Gdk.Color fontcolor = new Gdk.Color(255,255,255);
SyncInfo.ModifyFg(StateType.Normal, fontcolor);
Run Code Online (Sandbox Code Playgroud)
请注意,fontdesc.Size已注释掉.因为只有当我评论它时,我才会看到带有文字的标签.如果我为其设置任何值,标签将不会出现.
另外,我做了一个Console.WriteLine,默认大小为0.所以我尝试了frontdesc.Size = 0,它仍然消失,任何想法?
谢谢!
我主要在Linux上玩F#,并希望默认引用所有必需的GUI库(Gtk,Gdk,Atk,Glib,Pango,Cairo),以便我可以简单地使用:
open Gtk;;
无需任何额外的输入.我最好的猜测是修改fsi启动脚本,目前看起来像这样:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@
Run Code Online (Sandbox Code Playgroud)
更新:脚本的工作版本,如Stephen的建议:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r "/usr/lib/cli/atk-sharp-2.0/atk-sharp.dll" -r "/usr/lib/cli/glib-sharp-2.0/glib-sharp.dll" -r "/usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll" -r "/usr/lib/cli/gtk-sharp-2.0/gtk-sharp.dll" -r "/usr/lib/cli/pango-sharp-2.0/pango-sharp.dll" -r "/usr/lib/mono/2.0/Mono.Cairo.dll" $@
Run Code Online (Sandbox Code Playgroud) 我使用带有ListStore的TreeView作为模型.当用户点击一行时,我想采取一些行动但不使用单元格中的值,但使用我创建的行数据......
目前我有TreeView,TreeModel(ListStore)和我自己的数据(我讽刺地称之为模型).
所以问题是:
拥有一个模型 - 我想要显示的数据的对象表示并填充ListStore以显示在TreeView中的数据是否"正确",或者更好地实现自己的TreeModel版本(包装我的数据) model)显示数据?
并且:
如果有人双击一行,我可以获得RowActivated事件(使用C#/ Gtk#),该事件提供激活行的路径.有了它我可以得到一个TreeIter并使用它我可以得到一个单元格的值.但是,首先要找到构造行的数据对象的最佳实践是什么?\(不知何故,这个问题让我想到了第一个 - 通过思考如果我试图实现自己的数据对象会更容易TreeModel的...)
我使用NodeView对象以这种方式向用户输出数据(Gtk#tutorial):
[Gtk.TreeNode (ListOnly=true)]
public class MyTreeNode : Gtk.TreeNode {
string song_title;
public MyTreeNode (string artist, string song_title)
{
Artist = artist;
this.song_title = song_title;
}
[Gtk.TreeNodeValue (Column=0)]
public string Artist;
[Gtk.TreeNodeValue (Column=1)]
public string SongTitle {get { return song_title; } }
}
Gtk.NodeStore store;
Gtk.NodeStore Store
{
get {
if (store == null)
{
store = new Gtk.NodeStore (typeof(MyTreeNode));
store.AddNode (new MyTreeNode ("The Beatles", "Yesterday"));
store.AddNode (new MyTreeNode ("Peter Gabriel", "In Your Eyes"));
store.AddNode (new MyTreeNode ("Rush", "Fly By Night")); …Run Code Online (Sandbox Code Playgroud) 我正在尝试改变GTK#中的主题(操作系统:Windows,IDE:Xamarin).但我接下来的问题:
我只能找到一个正确呈现的主题,它是"Orta".一切都很好,除了滞后和冻结.这是我的代码:
string Resource_File = "Orta\\gtk-2.0\\gtkrc";
Application.Init ();
Gtk.Rc.AddDefaultFile (Resource_File);
Gtk.Rc.Parse (Resource_File);
MainWindow win = new MainWindow ();
win.Show ();
Application.Run ();
当我改变Paned或点击按钮的大小时,我得到了GUI冻结(我已经问过这个问题).只有在使用此主题时才会出现此问题,其他主题都可以正常工作.我使用搜索并发现了一些意见,关于这是由于使用Cairo渲染图形(其中之一).
如果我尝试使用不同的主题,很多GUI元素在我的GTK#应用程序中没有正确呈现,但它们在GTK主题选择器中正确呈现.如果主题在GTK主题选择器中正确显示,那么我尝试在我的Gtk#app中使用所选的gtkrc文件(如"Orta"中的示例所示),但几乎总是,大多数小部件都没有正确显示(这里是一个例子)
所以我有几个问题:
所以我需要你的帮助!谢谢!
我刚刚在Mac OSX上安装了Xamarin Monodevelop,我创建了一个GTK#项目,我有一个非常基本的窗口,我甚至都没有触及过.这是它给我的错误Build();
Error CS0103: The name 'Build' does not exist in the current context
using System;
using Gtk;
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;
}
}
Run Code Online (Sandbox Code Playgroud) 这是我遇到的问题:我使用MonoDevelop编写了一个Gtk#程序,它运行得很好.但现在我希望能够在其他Linux机器上运行它,而无需安装MonoDevelop.
我的解决方案有两个项目:主要的Gtk#应用程序,以及它所依赖的C#库项目.因此,当我构建主项目时,它会生成MainProject.exe和MainProject.exe.mdb,以及bin/Release文件夹中的DependencyProject.dll.
我尝试运行以下命令将它全部打包成一个可执行文件(从bin/Release文件夹运行):
mkbundle MainProject.exe -o mainproject --deps *.dll
Run Code Online (Sandbox Code Playgroud)
但是,我从运行该命令得到此错误:
未处理的异常:
System.IO.FileNotFoundException:无法加载文件或程序集"gtk-sharp"或其依赖项之一.该系统找不到指定的文件.
文件名称:'gtk-sharp'
在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000] in:0
at(wrapper remoting-invoke-with-check)System.AppDomain:Load(string,System.Security.Policy.Evidence,bool)
在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000] in:0
在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000] in:0
在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requesModule,Boolean throwOnError)[0x00000] in:0
在IKVM.Reflection.Universe.Load(System.String refname)[0x00000] in:0
在MakeBundle.QueueAssembly(System.Collections.Generic.List`1文件,System.String代码库)[0x00000]中:0
[错误]致命的未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'gtk-sharp'或其依赖项之一.该系统找不到指定的文件.
文件名称:'gtk-sharp'
在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000] in:0
at(wrapper remoting-invoke-with-check)System.AppDomain:Load(string,System.Security.Policy.Evidence,bool)
在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000] in:0
在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000] in:0
在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requesModule,Boolean throwOnError)[0x00000] in:0
在IKVM.Reflection.Universe.Load(System.String refname)[0x00000] in:0
在MakeBundle.QueueAssembly(System.Collections.Generic.List`1文件,System.String代码库)[0x00000]中:0
我看到了其他一些类似问题的Stack Overflow问题,但没有一个提供任何实用的解决方案.如何mkbundle有效地使用此命令?
我正在使用此解决方案删除特定路径中的所有空文件夹和子目录:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetFiles(directory).Length == 0 &&
Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它完美地运作.但我想删除所有空文件夹以及非空文件夹,但也不包含.dvr扩展名文件.
例如,我的文件夹包含以下文件:
一个日志
博客
c.dvr
d.dat
因此,无法删除此文件夹,因为它包含带有dvr扩展名的文件.
我该如何过滤它?(我正在使用GTK#但我相信C#代码可以工作,因为这个解决方案是C#代码)