以某种模糊的方式,一个不添加新功能的派生类(尚未)与它的基类行为不同.派生类:
public class MyCheckButton : CheckButton
{
public MyCheckButton(string label) : base(label)
{
}
}
Run Code Online (Sandbox Code Playgroud)
MyCheckButton继承自(GTK#,Mono项目的一部分)CheckButton.但是,在以下代码段中,它们的行为有所不同:
var button1 = new CheckButton("_foo");
var button2 = new MyCheckButton("_foo");
// code omitted
Run Code Online (Sandbox Code Playgroud)
标签中的下划线确保标签获得助记符.对于button1,这适用于我的测试代码:我得到"foo",其中f加下划线.但是对于button2,这会失败.我只是在对话框中将"_foo"作为标签.
任何人都可以解释这个示例中的派生类如何表现不同,或者屏幕后面是否有一些魔法可能会检查实际类的类型?
我是第一次尝试单声道.以下是我设置它的步骤.
在VirtualBox中安装了Kubuntu 12.04 LTS
apt-get install mono-complete gtk-sharp2
Run Code Online (Sandbox Code Playgroud)
然后我尝试在本教程中运行hello world应用程序.
http://www.mono-project.com/Mono_Basics
命令行应用程序运行正常.
我按照说明使用以下命令编译了GTK应用程序:
gmcs hello.cs -pkg:gtk-sharp-2.0
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,它失败并出现以下错误:
Missing method System.Type::op_Inequality(Type,Type) in assembly /usr/lib/mono/2.0/mscorlib.dll, referenced in assembly /usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f/gtk-sharp.dll
Unhandled Exception: System.MissingMethodException: Method not found: 'System.Type.op_Inequality'.
at Gtk.Window..ctor (System.String title) [0x00000] in <filename unknown>:0
at Hello.Main () [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.MissingMethodException: Method not found: 'System.Type.op_Inequality'.
at Gtk.Window..ctor (System.String title) [0x00000] in <filename unknown>:0
at Hello.Main () [0x00000] in <filename unknown>:0
Run Code Online (Sandbox Code Playgroud)
对我来说,单声道库看起来与gtk-sharp库不兼容.
有没有人对如何使这个工作有任何建议?
将Gtk#RadioButton类的实例添加到GUI时,会自动检查("激活")其单选按钮组的第一个成员.
对于Gtk,这在一定程度上已经在另一个问题中进行了讨论,所选答案的要点是用户希望始终选择一个单选按钮.
我不反对.
但是,我会以某种方式自动生成用户界面,因此每个单选按钮都链接到数据模型,但是没有一个单选按钮可以随时获取对任何其他RadioButton实例的引用.数据模型确保始终检查一个单选按钮.
除了足以满足用户期望之外,我认为这是一个好的做法,就像这样,数据完整性由数据模型确保,而不是由GUI确保.
不幸的是,Gtk#会自动检查这样的所有单选按钮,因为它认为每个单选按钮是其组中的第一个.为了将各种单选按钮添加到同一组,我必须将组中的第一个单选按钮传递给其他单选按钮的构造函数 - 我不能,如上所述,因为我没有任何方法可以获得实例化其他时对第一个单选按钮的引用.
设置单选按钮的Active属性false没有帮助,也没有调用该Toggle方法.
有没有办法抑制这种自动选择,可能是通过子类化和覆盖我还找不到的东西?或者,CheckButton为了这个目的,是否有可能强制a 看起来像一个单选按钮?
如果真的没有其他解决方案,我会尝试实现另一个答案中建议的解决方案,其中包括为我的每个单选按钮添加第二个隐藏的单选按钮,但我会发现对于生产代码非常hacky.
如果我只是做一个标准TextView与Justification设置为Center,它看起来是这样的:

如果我还希望垂直和水平居中文本,我该怎么做?
我正在测试一个看起来像这样的窗口:

将标签拖动到卡片可将标签链接到卡片.将卡片拖动到标签也是如此.
在两张牌之间放一个标签,或者在两张牌之间放一张牌是没有意义的.我可以在Handle...DataReceived函数中忽略这些结果,如下所示:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
Run Code Online (Sandbox Code Playgroud)
但是,在拖动时,用户仍会看到要插入的选项:

我该如何防止这种情况发生?
我是Gtk#和Gdk#的完全新手,我完全迷失了如何开始.
我想要做的就是在任何小部件/像素图/图像中绘制点和线,然后在我的gtk应用程序中显示它们.
到目前为止,我理解我必须创建一个Gdk.drawable对象来访问DrawPoints(Point[] points)和DrawLine(Point[] points)方法.但是,要实例化一个Drawable对象,我需要一个Gdk.GC对象.两个对象构造函数都有一个IntPtr参数,我不知道IntPtr我应该在这里传递什么?!或者,GC构造函数也可以使用Drawable对象,而Drawable构造函数可以使用GC对象......我在这里转圈!
这是24小时的在线研究,除了一些python示例使用不带参数的构造函数,我找不到任何资源来开始使用C#.
那么,有谁能告诉我如何正确使用这些GC和Drawable对象来使用该DrawLine(Point[] points)方法绘制一条线?
GDKEXAMPLE(){
win = new Gtk.Window ("Gdk nightmare");
win.SetDefaultSize (400, 300);
img=new Gtk.Image();
Drawable dr=new Drawable(null); //how to instantiate this object?
Gdk.GC gc=new Gdk.GC(null); //how to instantiate this object?
Point[] pts=new Point[3];
pts[0]=new Point(10,10);
pts[1]=new Point(15,20);
pts[2]=new Point(20,50);
dr.DrawLines(gc,pts);
Pixmap pxmp=new Pixmap(dr,100,100);
img.SetFromPixmap(pxmp,pxmp); //Requests a pixmap and pixmap mask: what mask?
img.QueueDraw();
win.Add(img);
win.ShowAll();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我使用Gdk.GC …
我有一个非常简单的Hello World示例,我使用Mono和gtk#在linux主机上编写.它只是显示带按钮的窗口.现在我试图在Windows上运行二进制文件但失败了.我使用单声道主页上的独立安装程序安装了gtk#.当我启动应用程序时,它会因以下原因而失败:
System.DllNotFoundException未处理:无法加载DLL'libglib-2.0-0.dll':找不到指定的模块.(来自HRESULT的异常:0x8007007E)Source = glib-sharp
有什么建议?BR
我试图在GTk#中使用system.drawing来操作图像.我希望UI在用户更新文本框时立即在屏幕上更新图像.为了实现这一点,我尝试使用winforms的后台工作程序,它工作但是当文本框以更高的速度更新,应用程序卡住而没有错误.
所以我在这里看了一下GTK中的多线程http://www.mono-project.com/docs/gui/gtksharp/responsive-applications/并创建了一个线程.
void textboxchanged()
{
Thread thr = new Thread (new ThreadStart (ThreadRoutine));
thr.Start ();
}
static void ThreadRoutine ()
{
LargeComputation ();
}
static void LargeComputation ()
{
image=new Bitmap(backupimage);
//Long image processing
}
Run Code Online (Sandbox Code Playgroud)
它的工作效果不如后台工作者抛出当前正在使用的对象其他地方错误,image=new Bitmap(backupimage);这时文本框中的输入速度甚至有点快.我做错了什么?
更新1:
我没有使用同时执行2个不同操作的2个不同线程来处理相同的图像.我在旧线程完成之前调用执行相同操作的线程.在后台工作者中我需要一种方法来检查旧线程已经完成工作,然后启动新的.所以我基本上正在寻找是一种方法来检查同一个线程的实例是否正在运行.在winforms我曾经做过 if(backgroundworker.isbusy==false) then do stuff
更新2
性能下降的解决方案
正如@voo建议更换全局位图有助于解决问题.我所做的不是使用全局位图.我创建了一个全局字符串(文件名).现在我使用img=new Bitmap(filename).Tried执行快速,因为我没有错误出现.所以有序更新GUI我使用了这里建议的调用mono-project.com/docs/gui/gtksharp/responsive-applications/.事情是没有出现错误和图像更新,但当打字操作足够快时,有一个等待参与.性能降低了.背景工作者不是这种情况.有没有办法提高性能.
在大图像处理操作方法结束时,我将其添加到更新GUI
Gtk.Application.Invoke (delegate {
MemoryStream istream=new MemoryStream();
img.Save (istream, System.Drawing.Imaging.ImageFormat.Png);
istream.Position = 0;
workimagepixbuff = new Gdk.Pixbuf (istream);
image1.Pixbuf = workimagepixbuff.ScaleSimple (400, 300, Gdk.InterpType.Bilinear);
}); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Gtk#-C#在Monodevelop中制作游戏,其中玩家使用箭头键移动角色.但是,箭头键按下没有注册.
有没有办法手动检测按键,绕过默认处理程序?
Google和Stack Overflow上的多次搜索都没有给出如何使用Gtk-C#检测箭头键的答案.
这是我用来尝试检测箭头键的代码:
protected void Key_Press (object obj, KeyPressEventArgs args)
{
//Let the rest of the program know what keys were pressed.
if (pressedKeys.Contains (args.Event.Key))
return;
pressedKeys.Add (args.Event.Key, args.Event.Key);
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试找出如何检测箭头键的基本程序:
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
this.KeyPressEvent += new KeyPressEventHandler (KeyPress);
}
protected void KeyPress (object sender, KeyPressEventArgs args)
{
if (args.Event.Key == Gdk.Key.Up)
return;
label1.Text = args.Event.Key.ToString ();
}
Run Code Online (Sandbox Code Playgroud) 我即将开始开发一个软件项目,如果可能的话,该项目应该在 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) gtk# ×10
c# ×7
mono ×5
gtk ×4
.net-core ×1
drawable ×1
gdk ×1
gtktreeview ×1
inheritance ×1
monodevelop ×1
radio-button ×1
windows ×1