我即将开始开发一个软件项目,如果可能的话,该项目应该在 Linux 和 Windows 上运行。由于我已经有一些 C# 经验,所以我渴望将它用于这个项目。我认为对于 .NET Core 3 和 GTK# 3.22 这应该不是问题,因为 .NET Core 应用程序应该是开箱即用的跨平台。GTK# - 根据我的理解 - 应该可以在任何地方使用相同版本的 GTK+。
为什么是 C#?嗯,我只是喜欢这种语言,而且我想使用一个适用于 c# 的 ECS 框架。
到目前为止,我已经在 Visual Studio 中设置了一个针对 .NET Core 3 的测试控制台应用程序项目,并添加了GTK# 特定的 NuGet 包。
我写了一个简单的Hello World程序来测试环境。
using System;
using Gtk;
namespace GTKTest
{
class Program
{
static void Main(string[] args)
{
Application.Init();
Window win = new Window("Hello GTK");
Label lbl = new Label("This is a test GTK App written with C# for GNU/Linux …Run Code Online (Sandbox Code Playgroud) 我一直在学习使用TreeViews,这两种类型通常用于访问树的特定行.我真的不明白两者之间的区别.我的代码正在工作 - 我根据函数的必需参数在两者之间来回转换 - 但不是基于对原因的真正理解.
这两种类型有什么区别?
我正在寻找Gtk.ListStore中的一个功能,它像Winforms中的ListView.VirtualMode一样工作.
有类似的东西吗?
可能的重复:
我应该选择什么:GTK+ 还是 Qt?
什么更容易理解、更自然、更快掌握、每天用不同的语言愉快地使用 - 最新版本的 GTK 或 QT?
这个问题可能有点主观和神圣战争,但我相信很有趣、很重要并且可以客观地回答。
我正在尝试通过继承 Gtk.Bin 来创建自定义 GTK 小部件。我没有使用 Stetic GUI 构建器。这个小部件将包含几个标准的 Gtk 小部件(VBox、标签、按钮等)。
public class MyWidget : Gtk.Bin
{
public MyWidget : base ()
{
build ();
}
private void build ()
{
VBox vbox1 = new Vbox (true, 0);
vbox1.PackStart (new Label ("MyWidget"), true, true, 0);
this.Add (vbox1);
}
}
Run Code Online (Sandbox Code Playgroud)
同时,当我将自定义小部件添加到主窗口时,我什么也没看到。显示其他控件的窗口,为此自定义小部件分配了空间。我希望在其空间中看到“MyWidget”标签,但什么也没有显示。我单步调试调试器中的代码,所有代码都被调用,但在运行时没有显示。
任何帮助,将不胜感激。
我正在尝试在 Gtk.Image 小部件上设置单个像素。文档指出 Gtk.Image 的 ImageProp 属性返回一个 Gdk.Image 似乎可以让您编辑单个像素,但是每当我使用它时它只返回空值。
到目前为止,我的解决方案是从磁盘加载图像作为 System.Drawing.Bitmap,对其进行编辑,将其保存到一个临时文件,然后将其加载回 Gtk.Image,但这显然并不理想。
为了
Gtk.Image image = new Gtk.Image("images/test.png");
Gdk.Image gdkImage = image.ImageProp;
Run Code Online (Sandbox Code Playgroud)
为什么 gdkImage 总是为空?
图像本身加载并正确显示。
我正在使用GTK,我已经CheckButton在窗口中插入了(GTK版本的复选框).现在我需要得到它是否被检查.我怎么做?
我正在使用Mono和Gtk#开发应用程序。在我的应用程序内部,我需要使用TreeView控件。我正在寻找一种在单元格内呈现小部件而不是绘制所有内容的方法。我有想要在这些单元格中使用的自定义小部件,并且我不想手动绘制它们。
我查看了文档和论坛,但没有找到一种方法。我认为这是不可能的,因为CellRendererCombo和CellRendererToggle似乎渲染了一个Widget。
谢谢
这是我遇到的问题:我使用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有效地使用此命令?
上下文
我正在将 C/GTK+ GUI 应用程序转换为 C#。我在 VS2017 中使用 GTKSharp 绑定版本 3.22.0。
该应用程序声明了几个信号,例如
g_signal_new ("SIG_NAME", params...);
Run Code Online (Sandbox Code Playgroud)
并通过 发出它们g_signal_emit_by_name(... "SIG_NAME"...)。
问题
我找不到一种方法将该行为转换为 GTK#。
我研究了 GTK# 的源代码,了解如何定义和处理自定义信号,就像这里一样,但我无法模仿那里实现的行为。
该方法
我尝试过像这样定义自定义对象:
using System;
using Gtk;
public class MyApp
{
public class MyCustomObj : GLib.Object
{
public delegate void MyDelegateSignalHandler(int arg0, int arg1);
public delegate void MyDelegate(int arg0, int arg1);
public class MyDelegateArgs : GLib.SignalArgs
{
public int a { get; set; }
}
public MyCustomObj() : base()
{}
[GLib.Signal("MyEvent")]
public …Run Code Online (Sandbox Code Playgroud)