自己用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#.netwinform

解决方案 »

  1.   

    以前也算测试过MONO的,但是我觉得它里面的类库不全,对于大型软件,还是没有直接安装.net环境靠谱。
    C#不安装.net环境问题
      

  2.   


    确实有大量的类库没有实现,我自己整理了很多了,但是不影响啊,很多东西我都已经做了兼容的代码修改,现在就剩最后一个问题了,如果我能用其他办法我都已经用上了,但是貌似确实是MONO是最好支持的当然也试过用飞信的那个.net虚拟机,但是由于版权和功能更少的问题,也放弃了,唉
      

  3.   

    终于找到原因了!!!!
    由于在启动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
      

  4.   

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

  5.   

    你搞错了这段代码的意图,ShowDialog方法是在打开新窗口的同时,将所有已经打开的其它窗口都禁用,只运行新打开的窗口活动,这段代码就是在禁用其它打开的窗口。因此这里是不存在问题的,如果你不想禁用其它打开的窗口,别用ShowDialog方法,直接使用Show方法。
      

  6.   

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

  7.   


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

  8.   


    呵呵,这些我都看了,我觉得我理解代码的意图,但是问题是我也反编译了.net自带的那个dll,为什么ms里面就没有这个操作了(你可以自己做一个showdialog的操作试试,在.net上是不是有一致的效果)
    这只能说明MONO的开发人员想多了其实你也挺搞笑的,如果可以用show这个方法的话,我干嘛要用showdialog呢?
    btw,还是谢谢你的回复,我已经把mono form的代码download下来,准备改完之后重新编译给自己用了
    呵呵
      

  9.   

    微软的窗体只是在Windows平台下使用,但是Mono的还要兼容Linux平台,说不定你这一改,Linux下面就有问题。
      

  10.   


    只要不是开多个窗口的程序(其实我的程序也不会开多个窗口),应该都不会有问题哦
    而且为了灵活性,我自己加上这些代码也可以,没有必要写死在mono的代码里面
    而且一般我也不建议在linux上跑mono的界面程序(一般后台程序还是挺方便的),特别是要兼容windows的,这样兼容的代码可是要大量大量的写。