zoukankan      html  css  js  c++  java
  • WPF 中如何使用第三方控件 ,可以使用WindowsFormsHost 类

    允许在 WPF 页面上承载 Windows Forms控件的元素。

    命名空间:   System.Windows.Forms.Integration

    程序集:   WindowsFormsIntegration(在 WindowsFormsIntegration.dll 中) 用于 XAML 的 XMLNS:http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/netfx/2007/xaml/presentation

    add: http://msdn.microsoft.com/zh-cn/library/system.windows.forms.integration.windowsformshost

    如果要引用的话

    <Window x:Class="Selection.Window1"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"     Title="Dates" Height="314" Width="373">     <Grid>     <Label HorizontalAlignment="Left" Margin="20,25,0,0" Name="label1" Width="35.63" Height="23.2766666666667" VerticalAlignment="Top">First</Label>     <Label Height="23.2766666666667" HorizontalAlignment="Left" Margin="20,56,0,0" Name="label2" VerticalAlignment="Top" Width="52.63">Second</Label>     <WindowsFormsHost Name="hostFirst" Margin="85,25,18,0" Height="23.2766666666667" VerticalAlignment="Top">       <wf:DateTimePicker Name="first"/>     </WindowsFormsHost>     <WindowsFormsHost Name="hostSecond" Margin="85,56,18,0" Height="23.2766666666667" VerticalAlignment="Top">       <wf:DateTimePicker Name="second"/>//文本框里是日期     </WindowsFormsHost>     <Button Height="23" HorizontalAlignment="Left" Margin="20,100,0,0" Name="compare" VerticalAlignment="Top" Width="75" Click="compareClick">Compare</Button>     <TextBox Margin="20,131,104,20" Name="info" TextWrapping="WrapWithOverflow" AcceptsReturn="False" IsReadOnly="True" />     <Button Height="22" HorizontalAlignment="Right" Margin="0,0,18,20" Name="quit" VerticalAlignment="Bottom" Width="75" Click="quitClick">Quit</Button>   </Grid> </Window>

    后台C#

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Forms;

    namespace Selection {   

      /// <summary>   

      /// Interaction logic for Window1.xaml     /

    // </summary>
        public partial class Window1 : Window     {      

       private DateTimePicker first;        

    private DateTimePicker second;
            public Window1()         {      

           InitializeComponent();

    //

      Child 获取或设置由 WindowsFormsHost 元素承载的子控件。      

                first = hostFirst.Child as DateTimePicker;        

         second = hostSecond.Child as DateTimePicker;         }
            private void quitClick(object sender, RoutedEventArgs e)         {         

        this.Close();     

        }
            private void compareClick(object sender, RoutedEventArgs e)         {       

          int diff = dateCompare(first.Value, second.Value);       

          info.Text = "";            

    show("first == second", diff == 0);          

       show("first != second", diff != 0);          

       show("first <  second", diff < 0);            

    show("first <= second", diff <= 0);           

      show("first >  second", diff > 0);           

      show("first >= second", diff >= 0);         }
            private void show(string exp, bool result)         {       

          info.Text += exp;        

         info.Text += " : " + result.ToString();      

           info.Text += " ";

     // 表示:回车符(ACSII:13 或0x0d),就是我们常说的硬回车。          

      //  表示:换行(ACSII:10 或0x0a),就是我们常说的软回车。    

             // ,好比你在DreamWeaver里做一个网页,在源代码里按一下回车,是给源代码换行。
            }
            private int dateCompare(DateTime leftHandSide, DateTime rightHandSide)         {      

           // TO DO            

    return 42;   

          }   

      }

    }

    WPF Windows Forms integration           

     

    在wpf程序中整合windows form:

    1.在references中添加WindowsFormsIntegration和System.Windows.Forms。

    2.在xaml中使用的时候要写清楚名字空间,可以把这两个ns定义出来。

     下面两句是重点,wpf书写的时候一定要注意引用

    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

    xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

    插入WindowsFormsControl:

    <wfi:WindowsFormsHost>             <wf:DateTimePicker/> </wfi:WindowsFormsHost>

    看到Windows.Forms下面也有Button控件(废话),于是想知道这个Button和WPF通常用的System.Windows.Controls.Button有什么不同。

    看了看两者的继承体系:

    System.Windows.Controls域中:  Button<ButtonBase<ContentControl<Control

    System.Windows.Forms域:         Button<ButtonBase<Control

    看似差不多,其实他们完全存在于两个不同的空间,没有一点联系。

    两个Button类里定义的内容也不尽相同,Forms.Button看上去内容丰富一些,发现里面有DoubleClick这个event,但是试了试并不起作用,换到windows form 程序下仍然不起作用。(Visual Studio的property界面上看不到这个事件,但是可以在代码里自己加event handler,虽然加了也白加)。Controls.Button里虽然没有DoubleClick,但是MouseDoubleClick是work的。而Forms.Button似乎就只能触发Click事件。

    <Window x:Class="WpfApplication1.Window1"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     Title="Window1" Height="300" Width="300">  

       <Grid xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"        

       xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"           >   

          <Grid.RowDefinitions>            

    <RowDefinition Height="*"/>            

    <RowDefinition Height="*"/>        

    </Grid.RowDefinitions>   

          <Button Grid.Row="1" MouseDoubleClick="Button_MouseDoubleClick">button</Button>        

    <wfi:WindowsFormsHost Grid.Row="0">            

    <wf:Button MouseDoubleClick="Button_MouseDoubleClick"/>     

        </wfi:WindowsFormsHost>     </Grid> </Window>

    这两个事件对应的event类型也不一样,一个是System.Windows.Input.MouseButtonEventHandler,一个是System.Windows.Forms.MouseEventHandler,所以对应的event handler的函数的参数也不一样,一个是private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e),一个是private void Button_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e),因此两个event handler函数名可以相同。

  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/4892181.html
Copyright © 2011-2022 走看看