Всем здравствуйте, это мой самый первый пост, до этого был только читателем данного сайта. Темой данного поста, является взаимодействие двух разный технологий, каждая из которых работает в своей управляемой среде, 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