Pull to refresh

C# WinForm/WPF + Adobe Flash

.NETAction Script
Sandbox
Всем здравствуйте, это мой самый первый пост, до этого был только читателем данного сайта. Темой данного поста, является взаимодействие двух разный технологий, каждая из которых работает в своей управляемой среде, 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());
Tags:FlashC#WinFormWPF
Hubs: .NET Action Script
Total votes 15: ↑9 and ↓6 +3
Views12.1K
C++ разработчик
July 1, 202176,800 ₽SkillFactory
C#-разработчик
July 1, 202181,000 ₽SkillFactory
Разработка на C#
July 15, 202180,000 ₽GeekBrains
Курс C# Junior Developer
July 20, 202123,990 ₽Level UP

Top of the last 24 hours