当前位置:编程学习 > C#/ASP.NET >>

用MONO的高手请进,急

自己用c#写了一个程序,.net 2.0的,用mono (版本:2.10.9) 开启动完全没有问题

但是在new form().showdialog()的时候,貌似所有界面元素都刷新了一遍
(貌似是把父form上的控件遍历了一遍,然后做了一次enable=false的操作)

完全找不出原因,陆续研究了两个月毫无头绪,不知道有没有高手遇到过这样的问题

麻烦有高手解答解答

这几天全天都投入到这个问题的研究,在stack overflow上也发了问题,也给mono的界面开发团队发了信,但是貌似回答的人还是很少好,于是之后去Mono的github上找代码了:

https://github.com/mono/mono/blob/master/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs

要吃了上面的代码还是有点痛苦,明天继续研究,今天先写到这里!!!!!!!!!!!!!!!期待高手。。。。 Mono  界面 C# .net winform --------------------编程问答-------------------- 以前也算测试过MONO的,但是我觉得它里面的类库不全,对于大型软件,还是没有直接安装.net环境靠谱。
C#不安装.net环境问题 --------------------编程问答--------------------
引用 1 楼 yysyangyangyangshan 的回复:
以前也算测试过MONO的,但是我觉得它里面的类库不全,对于大型软件,还是没有直接安装.net环境靠谱。
C#不安装.net环境问题


确实有大量的类库没有实现,我自己整理了很多了,但是不影响啊,很多东西我都已经做了兼容的代码修改,现在就剩最后一个问题了,如果我能用其他办法我都已经用上了,但是貌似确实是MONO是最好支持的

当然也试过用飞信的那个.net虚拟机,但是由于版权和功能更少的问题,也放弃了,唉。。。 --------------------编程问答-------------------- 终于找到原因了!!!!
由于在启动showdialog的时候,在mono里面,会自动的把主窗体做this.enable=false的操作

这天煞的,为什么要在内部做这个操作啊,晕
我自己写一行代码不比内部实现的灵活么?

没有办法,明天再研究一下代码,实在没有办法,直接下mono那边的代码来改了
55555555555555

随便把Mono branch 2.10.9的代码共享一下:
https://github.com/mono/mono/blob/mono-2-10-9/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs --------------------编程问答-------------------- 找到mono里面的代码了
https://github.com/mono/mono/blob/mono-2-10-9/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs

                        var disable = new List<Form> ();
foreach (Form form in Application.OpenForms)
if (form.Enabled)
disable.Add (form);
foreach (Form form in disable){
disabled_by_showdialog.Add (form);
form.Enabled = false;
}
modal_dialogs.Add(this);

没有办法了,没有大牛,看来只能自己编译一个新的文件了
但是也不一定,要看一下form enable = false的时候,为什么还要循环所有的控件做enable=false的操作

楼上的朋友很谢谢,有时候一些项目用什么不是我们来决定了,不行你也得行,你这种遇到问题就不去尝试的,最后不会有什么成功的,给所有人一个告诫!!! --------------------编程问答--------------------
引用 4 楼 hudsonhuang 的回复:
找到mono里面的代码了
https://github.com/mono/mono/blob/mono-2-10-9/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs

                        var disable = new List<Form> ();
foreach (Form form in Application.OpenForms)
if (form.Enabled)
disable.Add (form);
foreach (Form form in disable){
disabled_by_showdialog.Add (form);
form.Enabled = false;
}
modal_dialogs.Add(this);

没有办法了,没有大牛,看来只能自己编译一个新的文件了
但是也不一定,要看一下form enable = false的时候,为什么还要循环所有的控件做enable=false的操作

楼上的朋友很谢谢,有时候一些项目用什么不是我们来决定了,不行你也得行,你这种遇到问题就不去尝试的,最后不会有什么成功的,给所有人一个告诫!!!

你搞错了这段代码的意图,ShowDialog方法是在打开新窗口的同时,将所有已经打开的其它窗口都禁用,只运行新打开的窗口活动,这段代码就是在禁用其它打开的窗口。因此这里是不存在问题的,如果你不想禁用其它打开的窗口,别用ShowDialog方法,直接使用Show方法。 --------------------编程问答-------------------- 补充:如果你还看不懂,看OnFormClosed方法,在新开的窗口关闭的时候,它有还原之前禁用的窗口的操作。 --------------------编程问答--------------------
引用 6 楼 qldsrx 的回复:
补充:如果你还看不懂,看OnFormClosed方法,在新开的窗口关闭的时候,它有还原之前禁用的窗口的操作。


呵呵,这些我都看了,我觉得我理解代码的意图,但是问题是我也反编译了.net自带的那个dll,为什么ms里面就没有这个操作了(你可以自己做一个showdialog的操作试试,在.net上是不是有一致的效果)
这只能说明MONO的开发人员想多了

其实你也挺搞笑的,如果可以用show这个方法的话,我干嘛要用showdialog呢?
--------------------编程问答--------------------
引用 7 楼 hudsonhuang 的回复:
Quote: 引用 6 楼 qldsrx 的回复:

补充:如果你还看不懂,看OnFormClosed方法,在新开的窗口关闭的时候,它有还原之前禁用的窗口的操作。


呵呵,这些我都看了,我觉得我理解代码的意图,但是问题是我也反编译了.net自带的那个dll,为什么ms里面就没有这个操作了(你可以自己做一个showdialog的操作试试,在.net上是不是有一致的效果)
这只能说明MONO的开发人员想多了

其实你也挺搞笑的,如果可以用show这个方法的话,我干嘛要用showdialog呢?


btw,还是谢谢你的回复,我已经把mono form的代码download下来,准备改完之后重新编译给自己用了
呵呵 --------------------编程问答-------------------- 微软的窗体只是在Windows平台下使用,但是Mono的还要兼容Linux平台,说不定你这一改,Linux下面就有问题。 --------------------编程问答--------------------
引用 9 楼 qldsrx 的回复:
微软的窗体只是在Windows平台下使用,但是Mono的还要兼容Linux平台,说不定你这一改,Linux下面就有问题。


只要不是开多个窗口的程序(其实我的程序也不会开多个窗口),应该都不会有问题哦
而且为了灵活性,我自己加上这些代码也可以,没有必要写死在mono的代码里面
而且一般我也不建议在linux上跑mono的界面程序(一般后台程序还是挺方便的),特别是要兼容windows的,这样兼容的代码可是要大量大量的写。。。。 --------------------编程问答-------------------- 除
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,