none
WindowsFormsHost霸之道 RRS feed

  • 问题

  • 在WPF项目中需要用到SuperMap的MapControl作GIS应用。

    使用WindowsFormsHost作为容器装载Winform控件,却发现容器外无论怎样、如何防止WPF元素,都无法正常显示。

    求解!

    具体代码如下:

    <UserControl x:Class="GISPart.GISDesigner"
    
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
        mc:Ignorable="d" 
    
        xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
    
        xmlns:Winform="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    
        d:DesignHeight="300" d:DesignWidth="300">
    
     <Grid>
    
      <Grid x:Name="Container">
    
       <wfi:WindowsFormsHost>
    
        <Winform:WebBrowser Url="http://www.bing.com"/>
    
       </wfi:WindowsFormsHost>   
    
      </Grid>
    
      <Grid>
    
       <!--以下矩形在运行状态下无法显示!-->
    
       <Rectangle Width="100" Height="100" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Red"/>
    
      </Grid>
    
     </Grid>
    
    </UserControl>
    
    
    
    
    
    
    虽然已经从以下参考中了解到了“空域”问题,希望有大虾能解决一下“WPF元素浮动于WindowsFormsHost”这个问题,谢谢!
    2010年8月25日 12:03

答案

  • WPF是Windows的最新图形呈现技术,为了提高性能并减少资源浪费,WPF中的所有内建控件都是无窗口的。

    而传统的Windows控件,例如你所使用的WebBrowser控件,是有窗口的(你甚至可以通过某些工具来显示出这个控件的“标题栏”),这也是它必须放在WindowsFormsHost中的原因。

     

    本质上说像WPF中这样的无窗口的控件是由包含控件的窗口自己来绘制在自己的表面上的,而传统Windows Form的有窗口的控件是覆盖在容纳控件的窗口表面之上的,显然直接绘制在窗口表面的东西无论如何无法避免被表面之上的控件覆盖,这是个无解的难题。

     

    如果你并不是特别需要WPF的功能,可以考虑用Windows Form。

    如果你需要在一定程度上使用XAML的富UI能力,可以考虑使用Silverlight 4,并利用其中内建的WebBrowser控件——但请注意,Silverlight在使用上和一般的.NET功能有些区别,在没有经验的情况下使用Silverlight进行开发可能会很有难度。

     

     

    关于有窗口的WebBrowser控件会覆盖一切WPF内建控件的问题,我建议你通过Connect向微软的.NET和Visual Studio团队反映。


    Most questions i'm interested in might have two or more possible answers i know or i don't know. So please read question carefully before you try to answer, and explan your question detailedly before asking for help. 很多看起来简单的问题都存在多种可能性,如果您不能详细的解释,别人就不能正确判断出您所遭遇的实际状况,因而不能给出最适合的解决办法。在您没有给出详细信息的情况下,施助者只有张贴大量有可能有关的解决办法。而您可能没有耐心阅读所有这些东西,在这种情况下您就客观地形成了对施助者的伤害——除非“施助者”并没有用心去尝试帮助您。 同样地,当您尝试解答一个看起来“好像遇到过”的问题的时候,您也需要详细地阅读和理解这个问题。如果您不了解问题的细节,您可能会给出不相关的或者无助于解决当前问题的解答。
    • 已标记为答案 懵盛盛 2010年8月27日 3:03
    2010年8月25日 20:17

全部回复

  • WPF是Windows的最新图形呈现技术,为了提高性能并减少资源浪费,WPF中的所有内建控件都是无窗口的。

    而传统的Windows控件,例如你所使用的WebBrowser控件,是有窗口的(你甚至可以通过某些工具来显示出这个控件的“标题栏”),这也是它必须放在WindowsFormsHost中的原因。

     

    本质上说像WPF中这样的无窗口的控件是由包含控件的窗口自己来绘制在自己的表面上的,而传统Windows Form的有窗口的控件是覆盖在容纳控件的窗口表面之上的,显然直接绘制在窗口表面的东西无论如何无法避免被表面之上的控件覆盖,这是个无解的难题。

     

    如果你并不是特别需要WPF的功能,可以考虑用Windows Form。

    如果你需要在一定程度上使用XAML的富UI能力,可以考虑使用Silverlight 4,并利用其中内建的WebBrowser控件——但请注意,Silverlight在使用上和一般的.NET功能有些区别,在没有经验的情况下使用Silverlight进行开发可能会很有难度。

     

     

    关于有窗口的WebBrowser控件会覆盖一切WPF内建控件的问题,我建议你通过Connect向微软的.NET和Visual Studio团队反映。


    Most questions i'm interested in might have two or more possible answers i know or i don't know. So please read question carefully before you try to answer, and explan your question detailedly before asking for help. 很多看起来简单的问题都存在多种可能性,如果您不能详细的解释,别人就不能正确判断出您所遭遇的实际状况,因而不能给出最适合的解决办法。在您没有给出详细信息的情况下,施助者只有张贴大量有可能有关的解决办法。而您可能没有耐心阅读所有这些东西,在这种情况下您就客观地形成了对施助者的伤害——除非“施助者”并没有用心去尝试帮助您。 同样地,当您尝试解答一个看起来“好像遇到过”的问题的时候,您也需要详细地阅读和理解这个问题。如果您不了解问题的细节,您可能会给出不相关的或者无助于解决当前问题的解答。
    • 已标记为答案 懵盛盛 2010年8月27日 3:03
    2010年8月25日 20:17
  • 谢谢Nanalich的详细解释!

    在Winform控件+WPF应用程序中,无可避免WPF某些控件会与Winform控件相互层叠,如果这是个无法避免的问题,不知微软有否折中的解决方案(譬如把WPF组件标记为Winform,从而可以使WPF可以正常加载到Winform之上。)

    PS:在WindowsFormsHost中使用ElementHost装载WPF元素这个方法已经尝试过,在显示上,ElementHost始终为“白底”覆盖在WindowsFormsHost容器中,并不美观。

    2010年8月26日 2:59
  • Windows Form控件和WPF控件的实现原理是完全不同的,无法通过“标记”之类的简单步骤互相转换,除非完全重做。

    但从WPF出现的那天开始就注定了传统的基于窗口的控件要逐渐退出舞台了,微软恐怕是不会再用窗口控件技术做普通的控件了,只有WebBrowser这样比较特殊的才可能继续创作或升级。


    Most questions i'm interested in might have two or more possible answers i know or i don't know. So please read question carefully before you try to answer, and explan your question detailedly before asking for help. 很多看起来简单的问题都存在多种可能性,如果您不能详细的解释,别人就不能正确判断出您所遭遇的实际状况,因而不能给出最适合的解决办法。在您没有给出详细信息的情况下,施助者只有张贴大量有可能有关的解决办法。而您可能没有耐心阅读所有这些东西,在这种情况下您就客观地形成了对施助者的伤害——除非“施助者”并没有用心去尝试帮助您。 同样地,当您尝试解答一个看起来“好像遇到过”的问题的时候,您也需要详细地阅读和理解这个问题。如果您不了解问题的细节,您可能会给出不相关的或者无助于解决当前问题的解答。
    2010年8月26日 17:33
  • 在需要使用第三方Winform控件时,就太痛苦了。

    虽然WPF是无可否认的未来王者,但也不能忽视Winform庞大的市场保有率啊!

    2010年8月27日 3:04