zoukankan      html  css  js  c++  java
  • [Aaronyang] 写给自己的WPF4.5 笔记24 [与winform交互-flash-DEMO-收尾篇1/6]

      =====潇洒的版权线======www.ayjs.net===== Aaronyang ===== AY ====== 安徽 六安 杨洋 ======   未经允许不许转载 ======

    1.新建个WPF应用程序,然后添加一个windows窗体

    此时左侧工具箱自动winform的工具箱了。

    然后添加个按钮,并设置DialogResult属性为OK

    打开WPF的MainWindow.xaml添加一个按钮,单击事件如下

        private void btnOpenWinform_Click(object sender, RoutedEventArgs e)
            {
                ShowSwfForm ss = new ShowSwfForm();
                if (ss.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
                    MessageBox.Show("OK按钮被单击");
                }
            }

    效果图:

     =============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ==========   未经允许不许转载 =========

    显示非模态窗口,首先添加WindowsFormIntegration.dll

    再添加一个按钮,我们打开winform的界面的事件如下

     private void btnOpenNormallWinform_Click(object sender, RoutedEventArgs e)
            {
                ShowSwfForm ss = new ShowSwfForm();
                //拦截键盘事件,方便界面获得键盘操作
                WindowsFormsHost.EnableWindowsFormsInterop();
                ss.Show();
            }

    不加这行 WindowsFormsHost.EnableWindowsFormsInterop();代码,打开窗口后按键将无法捕获,例如tab键,你可以试试。加上后,tab后按钮会有虚线框,说明tab键生效了。

    2.启用winform的可视化效果

     public partial class App : Application
        {
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                //System.Windows.Forms.Application.EnableVisualStyles();
            }
        }

    试一下定义个样式,发现不会生效的,但是上面那行代码EnableVisualStyles应该是让按钮跟随系统变化的

    3. 一个界面上的winform控件和wpf控件

    winform的每个控件都是独立窗口,每个控件都拥有自己屏幕的区域。

    wpf就有一个浮在屏幕上的顶级窗口。所以wpf只要有单独的顶级窗口句柄,并且wpf引擎组织整个窗口,窗口才能更好的渲染。WPF有些元素使用单独的窗口句柄。例如菜单、工具提示以及组合框的下拉部分。这些都有扩展窗口边界的能力。

    "空域"原则,WPF内容上放置winform窗体内容,winform窗体内容就会总在wpf的上面,而不管标记在什么地方声明的。所以不能通过重叠来组合WPF和winform窗体内容。意味着不能使用动画飞过winform窗体渲染的区域。同样内容也不能混合在一起。所以WPF的使用flash一般套个winform,但是flash当背景还是比较难的。

    4.在WPF中驻留winform的控件,我们需要使用WindowsFormsHost控件,如果要使用winform的控件,需要引入  xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

    <Window x:Class="win32WPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStartupLocation="CenterScreen"
            xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
            Title="MainWindow" Height="700" Width="800">
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="18*"/>
                <RowDefinition Height="205*"/>
            </Grid.RowDefinitions>
            <Button x:Name="btnOpenWinform" Click="btnOpenWinform_Click" Content="模态化打开winform" HorizontalAlignment="Left" Margin="28,10,0,0" VerticalAlignment="Top" Width="145"/>
            <Button x:Name="btnOpenNormallWinform" Click="btnOpenNormallWinform_Click" Content="正常winform" HorizontalAlignment="Left" Margin="178,10,0,0" VerticalAlignment="Top" Width="145"/>
            <WindowsFormsHost  Grid.Row="1">
                
            </WindowsFormsHost>
        </Grid>
    </Window>

    取值的话,直接给NumericUpDown控件加上x:name="nud"依赖属性,然后后台直接this.nud.Value.ToString(); 

    接着我们引入Flash的com组件

    引入玩才发现,2015年的flash  com组建已经变了,网上的基础教程一般没用了。好吧,自己琢磨。

    没有找到网上说的AxShockwaveFlash控件。

    但是,算了,还是果断放弃吧,我选择了第二种方案,找到C:WindowsSystem32MacromedFlash目录,找到了Flash.ocx和Flash64_17_0_0_134.ocx,我不知道哪个有用,猜测Flash64_17_0_0_134.ocx应该是64位的

    移除刚刚的ShockwaveFlash引用。我还是打开COM组建引用,然后浏览本地,选择了Flash.ocx,结果发现还是跟上次一样,好吧...思考中..

    然后我打开了ShowSwfForm.cs ,然后 winform版本的设计器的工具箱,右键常规-选择项-COM组件,找到Shockwave Flash Object,单击确定。接着拖动这个控件到winform窗体上,尼玛..

         出现了 

    好吧,你赢了,我又回到刚刚的WPF页面,写下了熟悉的AxShockwaveFlash代码,接下来就简单了。

    <Window x:Class="win32WPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStartupLocation="CenterScreen"
            xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
            xmlns:f="clr-namespace:AxShockwaveFlashObjects;assembly=AxInterop.ShockwaveFlashObjects"
            Title="MainWindow" Height="700" Width="800" Loaded="Window_Loaded">
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="18*"/>
                <RowDefinition Height="205*"/>
            </Grid.RowDefinitions>
            <Button x:Name="btnOpenWinform" Click="btnOpenWinform_Click" Content="模态化打开winform" HorizontalAlignment="Left" Margin="28,10,0,0" VerticalAlignment="Top" Width="145"/>
            <Button x:Name="btnOpenNormallWinform" Click="btnOpenNormallWinform_Click" Content="正常winform" HorizontalAlignment="Left" Margin="178,10,0,0" VerticalAlignment="Top" Width="145"/>
            <WindowsFormsHost  Grid.Row="1" x:Name="wfh">
                <!--<wf:NumericUpDown Maximum="100" Minimum="0" Increment="10" Width="100" Dock="Top"></wf:NumericUpDown>-->
                <f:AxShockwaveFlash x:Name="flashContainer"/>
            </WindowsFormsHost>
        </Grid>
    </Window>

    OK,后台代码,网上都是能百度出来的了。

       =============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ==========   未经允许不许转载 =========

           -------------------小小的推荐,作者的肯定,读者的支持。推不推荐不重要,重要的是希望大家能把WPF推广出去,别让这么好的技术消失了,求求了,让我们为WPF技术做一份贡献。-----------------

  • 相关阅读:
    iOS开发>学无止境
    iOS开发>学无止境
    iOS开发>学无止境
    Objective-C学习—UITableView的使用
    iOS开发>学无止境
    iOS开发—AFNetworking的使用
    iOS开发>学无止境
    c#笔记(六)——数组(2)
    c#笔记(六)——数组
    c#笔记(五)——循环结构
  • 原文地址:https://www.cnblogs.com/AaronYang/p/4346816.html
Copyright © 2011-2022 走看看