C# WinForm/WPF + Adobe Flash

в 10:09, , рубрики: .net, Action Script, flash, WinForm, wpf, Песочница, метки: , , ,

Всем здравствуйте, это мой самый первый пост, до этого был только читателем данного сайта. Темой данного поста, является взаимодействие двух разный технологий, каждая из которых работает в своей управляемой среде, Adobe Flash и Microsoft .NET.

В свое время, для одного .NET проекта искал замену графики GDI+ для WinForm. В качестве такой альтернативы была выбрана Flash технология. С SilverLight в то время не был знаком, а затем организовать взаимодействие с этой технологий для WinForm, через компонент WebBrowser, не получилось.


После установки Adobe Shockwave Player, при выборе Com объектов в среде Visual Studio, становится доступным визуальный компонент Shockwave Flash Object. Этот компонент имеет множество свойств для работы с роликами в формате swf. В частности, если задать физический или сетевой путь к ролику в свойстве Movie, он будет отображен на форме, также, как бы это происходило в браузере. Затем, через метод SetVariable(string Property, string Data), можно передать информацию из C# в какое-либо свойство Flash.

WinForm + Flash

Объявление внешнего свойства Flash на ActionScript 2.0 (1.swf)

//Получить данные
getvar = function () {
};
// Установить данные
setvarData = function (value) {
	var Value:Number=Number(value);
             // Перейти на кадр
	_root.gotoAndStop(Value+1);
};
addProperty("MyObject", getvar, setvarData); 

Передать информацию в Flash ролик из С#.
Перед этим в WinForm был положен компонент Shockwave Flash Object, с именем Flash и задано его свойство Movie c физическим путем к ролику 1.swf.

int i = 1;
Flash.SetVariable("MyObject",i.ToString());

WPF + Flash

Недавно стало интересно, как приложение на WPF будет выглядеть в связке с Flash. Поискал по интернету, но к сожалению такой информации если и есть, то её оказалось очень мало.
В итоге, создал Flash компонент для этого типа приложений.

XAML

<UserControl x:Class="WindowsFormsApplication1.UserControl1"
             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" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="#FF00E100" Loaded="Grid_Loaded">
        <WindowsFormsHost HorizontalAlignment="Stretch" Name="windowsFormsHost1" VerticalAlignment="Stretch" DataContext="{Binding}" Focusable="True" Margin="22,12,24,21" Background="#FF00005A" />
    </Grid>
</UserControl>

Flash Object

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 AxShockwaveFlashObjects;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    /// <summary>
    /// Логика взаимодействия Flash
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public AxShockwaveFlashObjects.AxShockwaveFlash AxShockwaveFlash;
        public UserControl1()
        {
            AxShockwaveFlash = new AxShockwaveFlash();
            InitializeComponent();           
            windowsFormsHost1.Child = AxShockwaveFlash;

            this.AxShockwaveFlash.VisibleChanged += new System.EventHandler(this.AxShockwaveFlash_VisibleChanged);
        }


        public string _Movie;

        public  string Movie {
            set {  _Movie = value;    }
            get { return AxShockwaveFlash.Movie; }
        }



        private void AxShockwaveFlash_VisibleChanged(object sender, EventArgs e)
        {
            if (IsVisible)
            {
                try
                {
                    if (Movie != null || Movie != _Movie)
                        AxShockwaveFlash.Movie = _Movie;
                }
                catch
                {
                }
            }
        }

        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            AxShockwaveFlash.Menu = false;
        }

    }
}

Передать информацию в Flash ролик из С#, аналогично WinForm
Перед этим был положен компонент UserControl1, с именем Flash и задано его свойство Movie c физическим путем к ролику 1.swf.

int i = 1;
Flash.AxShockwaveFlash.SetVariable("MyObject",i.ToString());

Автор: askeet

* - обязательные к заполнению поля