none
用blend3做的动画,想把这个动画(wpf)嵌入到winform窗口里。之前有一个篇文章也是这个问题,但是还是有问题不能运行! RRS feed

  • 问题

  • 用blend3做的动画,想把这个动画(wpf)嵌入到winform窗口里。之前有一个篇文章也是这个问题,但是还是有问题不能运行!

    下图是我剪切下来的。

    2010年11月7日 13:00

答案

全部回复

  • 你好,

    如果你想在Winfom里面嵌入并且运行WPF组件,你可以使用ElementHost在Winform里面。关于如何整合WPF和Winform, MSDN提供了一系列的文章, 你可以逐个参考下: 

    WPF 和 Win32 互操作概述

    教程:创建用于承载 WPF 内容的 Win32 应用程序

    在 Win32 和 WPF 之间共享消息循环
    教程:创建用于承载 Win32 内容的 WPF 应用程序
    WPF 互操作:“空域”和 Window 区域概述
    Windows 窗体和 WPF 互操作性输入体系结构
    WindowsFormsHost 元素的布局注意事项
    Windows 窗体和 WPF 属性映射
    WPF 和 Windows 窗体互操作中支持的方案
    Windows 窗体控件和等效的 WPF 控件
    混合应用程序疑难解答

     

     顺便,那张图片无法显示,是否可以检查下图片的连接,或者你可以把图片上传Skydrive.com上,然后贴出连接。

    对于你的具体问题,因为缺少资料,所以我们很难去猜测发生了什么问题,如果可以的话, 你可以分享下你的代码或者项目,这样我们可以直观地帮助你来调试。否则,我们只能尽我们所能去指导你使用WPF和Winform融合技术,和猜测问题所在(成千上万,太难猜了)。

    谢谢!

     

    致,

    Bob Bao


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Are you looking for a typical code sample? Please download all in one code framework !
    2010年11月11日 7:44
    版主
  • 我的第一步:是把一个简单的动画,嵌入的我的form1里显示。

    我的第二步:是用在创建的wfp+sketchflow的工程文件里创建Storyboard1、Storyboard2、Storyboard3 多个布局,用按钮控件(按钮控件模仿的是事件触发)触发每个Storyboard中的动画开始动,这个功能也是要嵌入我的form窗口里。(第一步我都没有实现,第二步只是说一下,我最终要实现)

    1、想问一下,我用blend3实现步骤2是否能行?是否合理?

    2、我第一步代码很简单,用 blend3建了一个 wfp+sketchflow的工程文件。 用rectangle控件画了一个方形图案,创建额一个对象和时间线Storyboard1.在这里面做了方块移动的动画(有鼠标点击左键动画开始移动的触发器)

    code

    <UserControl
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Name="pingmu_Name"
     mc:Ignorable="d"
     x:Class="WpfPrototype2Screens.pingmu"
     Width="640" Height="480">
     <UserControl.Resources>
      <Storyboard x:Key="Storyboard1">
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="246"/>
        <SplineDoubleKeyFrame KeyTime="00:00:01" Value="92"/>
       </DoubleAnimationUsingKeyFrames>
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="4"/>
        <SplineDoubleKeyFrame KeyTime="00:00:01" Value="111"/>
       </DoubleAnimationUsingKeyFrames>
      </Storyboard>
     </UserControl.Resources>
     <UserControl.Triggers>
      <EventTrigger RoutedEvent="UIElement.MouseLeftButtonDown" SourceName="LayoutRoot">
       <BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
      </EventTrigger>
     </UserControl.Triggers>

     <Grid x:Name="LayoutRoot" Background="White">
      <Rectangle x:Name="rectangle" Fill="#FFCE1F1F" Stroke="Black" HorizontalAlignment="Left" Margin="52,214,0,215" Width="107" RenderTransformOrigin="0.5,0.5">
       <Rectangle.RenderTransform>
        <TransformGroup>
         <ScaleTransform/>
         <SkewTransform/>
         <RotateTransform/>
         <TranslateTransform/>
        </TransformGroup>
       </Rectangle.RenderTransform>
      </Rectangle>
     </Grid>
    </UserControl>

    我在vs2010中创建了一个from窗口工程。并在工程中有添加了新的wpf用户控制(usercontrol1),添加了PresentationCore、PresentationFramework、WindowsBase引用。

    把上面的代码粘帖到usercontrol1.xaml中。并在from1.cs里代码
    code
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Forms.Integration;
    namespace wpftoform
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                // Create the ElementHost control for hosting the
                // WPF UserControl.
                ElementHost elementHost1 = new ElementHost();
                elementHost1.Dock = DockStyle.Fill;
             
                // Create the WPF UserControl.
              WpfPrototype2Screens.ping_1 uc =
                new WpfPrototype2Screens.ping_1();
                // Assign the WPF UserControl to the ElementHost control's
                // Child property.
              elementHost1.Child = uc;
                // Add the ElementHost control to the form's
                // collection of child controls.
              this.Controls.Add(elementHost1);
          }
        }
    }
     
    其实我看了很多资料:
    1、用webbrowser控件能实现动画嵌入到form中?
    2、感觉是否用blend3来实现我要实现的功能是正确的?(我所有的功能都要在 Form上实现,动画只是其中一部分,动画的控制是通过串口数据,通过事件触发每个动画间的动作)
    3、希望高人指点一下,闲杂很迷茫。我的QQ是824392371
    2010年11月13日 2:39
  • 你好,

    首先,你的问题很复杂,不适合一次性解答,希望你可以将问题细化,逐个进行讨论,这样有助于问题的解决.当问题太庞大时,我们是很难进行全局掌控的.这样会很容易犯方向性错误.

    其次,你的问题设计了很多跨技术的领域,单单WPF一方是很难解答的。由于我在其它领域经验并不是很多,我只能尽我所能的给你一个较满意的答复:

    你说到用Blend3创建动画并加入Winform项目。这样,这个问题的答案是可行的,但如何去执行呢? 我建议你首先在Blend3里面创建一个WPF用户控件,然后把动画代码都调试好。然后在Visual Studio里面创建一个相似的WPF项目,同样调试完成。 这是前提,我们要分步骤,一步步完成并且做过测试后,在进行整合。

    然后,建立你的Winform项目,把调试好的WPf用户控件单元加入项目,我相信,在完成了前面的前提步骤后,后面的步骤是会顺利执行的。

    对于一个目标的实现,不可能一步到位,在系统工程上讲,我们只有完成了各个模块后,才能让整个工程成功运行。所以希望你能够化繁为简,化整体为布局,一个个问题来解决,最终达到整体的完美结合。

    对于你贴出的代码,只是展现了一部分信息,并不能从中找到问题,代码是正常的。但在整合中,你是否有名字空间引用问题?是否有类型转换问题?等等都是要注意的,所以你可以尝试的检查者方面:例如, “WpfPrototype2Screens.ping_1” 是否是一个你要的有效类?因为在你的XAML中,我看到了这个UserControl所映射的 .Net class是  x:Class="WpfPrototype2Screens.pingmu"  并不是你在Winform中引用的 WpfPrototype2Screens.ping_1

     

    以上是我的一些个人看法,希望对你的开发有帮助,谢谢。

    致,

    Bob Bao


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Are you looking for a typical code sample? Please download all in one code framework !
    2010年11月16日 11:19
    版主
  • BOB BAO你好,谢谢你耐心的解答。我对C#的了解很浅,希望你能指点。

    其实用ElementHost显示WPF的控件是没有问题的,但是如果是wpf的动画却不能显示,我运行上面说的代码,但是 Form窗口什么都不显示(注:我黏贴代码时粘的不对,UserControl里的  x:Class 与winform引用的是同一个)。就像我开始说的如果把下面的代码去掉。只留下<Grid>里面的内容,我再运行 Form中就会显示一个矩形(其实就是一个WPF控件)。是不是 Form窗口里就不能嵌入wpf动画,而只能调用控件呢?

    code(去掉下面的代码)

     <UserControl.Resources>
      <Storyboard x:Key="Storyboard1">
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="246"/>
        <SplineDoubleKeyFrame KeyTime="00:00:01" Value="92"/>
       </DoubleAnimationUsingKeyFrames>
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="4"/>
        <SplineDoubleKeyFrame KeyTime="00:00:01" Value="111"/>
       </DoubleAnimationUsingKeyFrames>
      </Storyboard>
     </UserControl.Resources>
     <UserControl.Triggers>
      <EventTrigger RoutedEvent="UIElement.MouseLeftButtonDown" SourceName="LayoutRoot">
       <BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
      </EventTrigger>
     </UserControl.Triggers>

    2010年11月16日 13:30
  • 你好,

    并不是你想象的那样,在Winform里面的ElementHost中可以完整地呈现WPF的特性,也包括了动画效果。

    我测试了你的代码,是由于你固定了UserControl的大小导致如果ElementHost过小的话看不见那个矩形框,很简单,把Margin="52,214,0,215" 去掉再试试。 下面是我的测试项目,希望对你有帮助:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/TestCase/20101117%5E_HostWPFControlInWinform%5E_TestCase.zip

    致,

    Bob Bao


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Are you looking for a typical code sample? Please download all in one code framework !
    • 已标记为答案 xzu 2010年11月17日 14:46
    2010年11月17日 10:24
    版主
  • 太谢谢 BOB BAO  你让我明白那里错了。简单动画可以实现,将来一定还会麻烦你。呵呵

    2010年11月17日 14:46