Воспоминание Microsoft Silverlight 08.10.2024
Всем доброе утро!
Сегодня хочу вспомнить про Microsoft Silverlight и WPF. Silverlight можно перевести с английского как серебрянный свет, это технология, которая должна была конкурировать с Macromedia/Adobe Flash и Sun/Oracle Java Applet. Вот так выглядел рекламный ролик примерно 2007-2008 гг.
Тут больше:
Чтобы создавать интерактивные приложения для веб браузеров для Microsoft Silverlight был выпущен Microsoft Expression Studio 2, и там шёл Microsoft Expression Blend 2 и Microsoft Expression Encoder 2, спомощью которых можно было создавать интерактивные приложения для веб браузеров для Microsoft Silverlight. Тут см. https://groups.germany.ru/12994140000001/f/41291130.html?C... я упомянул про Microsoft Expression Web, и Microsoft Expression Web 4, которые тоже входят в комплект с Microsoft Expression Studio. Но чтобы запустилось всё это, нужно ещё скачать Microsoft Expression Blend 2 SP1, так-же чтобы увидить интерактивное приложения для веб браузера, нужно скачать Microsoft Silverlight. Кстати в 2010 г. когда Microsoft выпустила Microsoft Windows Phone 7, см. https://ru.wikipedia.org/wiki/Windows_Phone_7 ходили слухи, что там будет поддержка Microsoft Silverlight.
Моя ФЛ Он и ОнаВот видео на русском про технологию Silverlight:
Моя ФЛ Он и ОнаДавайте из болтавни в практику, т.е. поиграемся с Microsoft Silverlight:
1. Запустим Microsoft Expression Blend 2

2. Нажмём на New Project...

3. Выберим Silverlight 1 Site:

Вот наш пустой экран:

4. Дальше сделаем так:

Вот код Default.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SilverlightSite</title>
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript" src="Page.xaml.js"></script>
<style type="text/css">
#silverlightControlHost {
height: 480px;
width: 640px;
}
#errorLocation {
font-size: small;
color: Gray;
}
</style>
<script type="text/javascript">
function createSilverlight()
{
var scene = new SilverlightSite.Page();
Silverlight.createObjectEx({
source: "Page.xaml",
parentElement: document.getElementById("silverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad),
onError: function(sender, args) {
var errorDiv = document.getElementById("errorLocation");
if (errorDiv != null) {
var errorText = args.errorType + "- " + args.errorMessage;
if (args.ErrorType == "ParserError") {
errorText += "
File: " + args.xamlFile;
errorText += ", line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
else if (args.ErrorType == "RuntimeError") {
errorText += "
line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
errorDiv.innerHTML = errorText;
}
}
}
});
}
if (!window.Silverlight)
Silverlight = {};
Silverlight.createDelegate = function(instance, method) {
return function() {
return method.apply(instance, arguments);
}
}
</script>
</head>
<body>
<div id="silverlightControlHost">
<script type="text/javascript">
createSilverlight();
</script>
</div>
<!-- Runtime errors from Silverlight will be displayed here.
This will contain debugging information and should be removed or
hidden when debugging is completed -->
<div id='errorLocation'></div>
</body>
</html>
Вот код Page.xaml:
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="640" Height="480" Background="White" x:Name="Page"> <TextBlock Canvas.Left="139" Canvas.Top="58" Width="175" Height="31" TextWrapping="Wrap" Foreground="#FFFF0000" Cursor="Hand" FontWeight="Bold" FontFamily="Lucida Sans Unicode" FontSize="20"><Run Text="Заголовок сайта"/> </TextBlock> </Canvas>
Вот код Page.xaml.js:
if (!window.SilverlightSite)
SilverlightSite = {};
SilverlightSite.Page = function(){}
SilverlightSite.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
this.control = control;
// Sample event hookup:
rootElement.addEventListener("MouseLeftButtonDown",
Silverlight.createDelegate(this, this.handleMouseDown));
},
// Sample event handler
handleMouseDown: function(sender, eventArgs)
{
// The following line of code shows how to find an
// element by name and call a method on it.
// this.control.content.findName("Storyboard1").Begin();
}}
Код Silverlight.js сильно большой.
Моя ФЛ Он и ОнаКак функционирует Microsoft Expression Encoder 2 я не могу показать, т.к. у меня не установлена программа Windows Media Encoder на виртуальной машине Windows XP, поэтому я покажу Microsoft Expression Encoder 4. Microsoft Expression Encoder позволяет аудио и видеофайлы превратить в Microsoft Silverlight:
1. Запустим Microsoft Expression Encoder 4 и выберем Silverlight Project:

2. Вот так выглядет запущенный Microsoft Expression Encoder 4

3. Импортируем видео File->Import:

4. Вставим видео в проект:

5. Вуаля!

Вот все готовые шаблоны видео и адио плееры:

Моя ФЛ Он и ОнаЕсли не хотите использовать Microsoft Expression Encoder, то можно напрямую видео импортировать в проект в Microsoft Expression Blend, а из проекта на форму/страницу Microsoft Silverlight см.:

Но тогда видео будет автоматически проигрываться при входе на сайт с Silverlight контентом, а так-же не будет кнопок управления (проигрывать, пауза, стоп, перемотка, итд), а так-же будет полоска прокрутки невидимой. Поэтому Microsoft Expression Encoder упращает жизнь.
Моя ФЛ Он и ОнаТак-же в Microsoft Expression Studio 2 входят Microsoft Expression Design 2, Microsoft Expression Media 2, и Microsoft Visual Studio 2008 Standard Edition. Про Microsoft Expression Media 2 можете узнать тут см. https://programming.mybb.ru/viewtopic.php?id=375.
В Microsoft Expression Design 2 можно создавать векторную графику, и импортировать, а так-же экспортировать в разные форматы см.:
Вот создания нового проекта:

Так выглядет интерфейс Microsoft expression Design 2:

Microsoft Expression Design 2 позволяет экспортировать разные форматы а так-же, в XAML Silverlight, в фотошоп, и PDF:

Microsoft Expression Design 2 может импортировать разные форматы а так-же фотошоп, Adobe Illustrator:

Моя ФЛ Он и ОнаЯ сейчас кушаю вот такой супчик, он и пишу в моём дневнике, oтeц или когда едем с мeдбpaтом по магазинам, покупаем замороженные овощи для супа, в супе на моей фотографии добавлена пекинская капуста, говядену покупаем в метцгерае, суп несалённый, но вкусный, запах идёт лука, я давно такие супы кушаю:

И так продолжем болтавню по Microsoft Expression Studio. В бесплатном Microsoft Expression Design 4, помимо того что могла экспортировать программа Microsoft Expression Design 2, в Microsoft Expression Design 4 можно экспортировать так-же в SVG, см.:

А. Импорт фотошоп файлов, и файлов в формате Adobe Illustrator появились в меню File:

Моя ФЛ Он и ОнаПродолжим болтавню про Microsoft Silverlight v1. В Microsoft Silverlight v1 нужно программировать на JavaScript. Нарисуем кнопку, вот код XAML:
<Canvas Canvas.Left="40" Canvas.Top="372" Width="129" Height="50" x:Name="btn1" Cursor="Hand">
<Rectangle Stroke="#FF2880C8" RadiusX="8.5" RadiusY="8.5" Width="129" Height="50">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF326BCE" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Canvas.Left="36.5" Canvas.Top="14.5" Width="56" Height="21" Foreground="#FFE51414" TextWrapping="Wrap"><Run Text="Кнопка"/></TextBlock>
</Canvas>
Вот так выглядет наша кнопка:

Вот код на JavaScript, чтобы сработало нажатие на кнопку:
if (!window.SilverlightSite)
SilverlightSite = {};
SilverlightSite.Page = function() {}
SilverlightSite.Page.prototype = {
handleLoad: function(control, userContext, rootElement) {
this.control = control;
this.control.content.findName("btn1").addEventListener("MouseLeftButtonDown",
Silverlight.createDelegate(this, this.handleMouseDown));
},
handleMouseDown: function(sender, eventArgs) {
alert('Нажали на кпопку!');
}}Вот результат:

Моя ФЛ Он и ОнаПродолжим болтавню. Теперь давайте сделаем простую анимацию.
Вот код Page.xaml:
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page">
<Canvas.Resources>
<Storyboard x:Name="Storyboard1">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:08.9000000" Value="168"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:08.9000000" Value="59"/>
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FF6299DC"/>
<SplineColorKeyFrame KeyTime="00:00:08.9000000" Value="#FFDCC762"/>
</ColorAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle"
Storyboard.TargetProperty="(Rectangle.RadiusX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:08.9000000" Value="31.5"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle"
Storyboard.TargetProperty="(Rectangle.RadiusY)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:08.9000000" Value="31.5"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
<Rectangle Fill="#FF6299DC" Stroke="#FF000000" Canvas.Left="149" Canvas.Top="39" Width="181"
Height="67" x:Name="rectangle" RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
<Canvas Canvas.Left="142.5" Canvas.Top="437.5" Width="84" Height="32" x:Name="play" Cursor="Hand">
<Rectangle Fill="#FF30A0E0" Stroke="#FF000000" RadiusX="4.5"
RadiusY="4.5" Width="84" Height="32"/>
<TextBlock Canvas.Left="22.5" Canvas.Top="3.5" Width="39" Height="25" TextWrapping="Wrap"><Run Text="Пуск"/></TextBlock>
</Canvas>
<Canvas Canvas.Left="245.5" Canvas.Top="437.5" Cursor="Hand" x:Name="stop" Width="84" Height="32">
<Rectangle Fill="#FF30A0E0" Stroke="#FF000000" RadiusX="4.5"
RadiusY="4.5" Width="84" Height="32"/>
<TextBlock Canvas.Left="22.5" Canvas.Top="3.5" Width="39" Height="25" TextWrapping="Wrap"><Run Text="Стоп"/></TextBlock>
</Canvas>
</Canvas>
Вот код Page.xaml.js:
if (!window.SilverlightSite)
SilverlightSite = {};
SilverlightSite.Page = function() {}
SilverlightSite.Page.prototype = {
handleLoad: function(control, userContext, rootElement) {
this.control = control;
this.control.content.findName("play").addEventListener("MouseLeftButtonDown",
Silverlight.createDelegate(this, this.handleMouseDown));
this.control.content.findName("stop").addEventListener("MouseLeftButtonDown",
Silverlight.createDelegate(this, this.handleMouseDown));
},
handleMouseDown: function(sender, eventArgs) {
if(sender.name == 'play')
this.control.content.findName("Storyboard1").Begin();
if(sender.name == 'stop')
this.control.content.findName("Storyboard1").Stop(); }}
А вот и результат:

Моя ФЛ Он и ОнаДавно неигрался в Silverlight. Сегодня продолжим играться. Только сегодня будем играться в Silverlight v2.0, и будем программировать не на JavaScript, а на C#. Но сначало оффтоп, недавно поел греческий йогурт:
Моя ФЛ Он и Она1. Короче создадим новый проект, и выбирим Silverlight 2 Application, а язык программирования C# (Visual C#):
2. Нарисуем такие элементы:

3. У поле должно быть имя txtYourName, а у кнопки btnSayName:
4. Напишим такой код:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication3 {
public partial class Page : UserControl {
public Page() {
// Required to initialize variables
InitializeComponent();
}
private void btnSayName_Click(object sender,System.Windows.RoutedEventArgs e) {
MessageBox.Show("Привет " + this.txtYourName.Text + "!");
}
}
}5. Вуаля! Вот так работает наше простое Silverlight 2 приложение:

Моя ФЛ Он и ОнаСгенерируется такой код:
Default.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>SilverlightApplication3</title>
<style type="text/css">
html, body {
height: 100%;
overflow: auto;
}
body {
padding: 0;
margin: 0;
}
#silverlightControlHost {
height: 100%;
}
</style>
<script type="text/javascript">
function onSilverlightError(sender, args) {
var appSource = "";
if(sender != null && sender != 0) {
appSource = sender.getHost().Source;
}
var errorType = args.ErrorType;
var iErrorCode = args.ErrorCode;
var errMsg = "Unhandled Error in Silverlight 2 Application " + appSource + "\n" ;
errMsg += "Code: "+ iErrorCode + " \n";
errMsg += "Category: " + errorType + " \n";
errMsg += "Message: " + args.ErrorMessage + " \n";
if(errorType == "ParserError") {
errMsg += "File: " + args.xamlFile + " \n";
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
else if(errorType == "RuntimeError") {
if(args.lineNumber != 0) {
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
errMsg += "MethodName: " + args.methodName + " \n";
}
throw new Error(errMsg);
}
</script>
</head>
<body>
<!-- Runtime errors from Silverlight will be displayed here.
This will contain debugging information and should be removed or hidden when debugging is completed -->
<div id='errorLocation' style="font-size: small;color: Gray;"></div>
<div id="silverlightControlHost">
<object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="SilverlightApplication3.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
<iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
</div>
</body>
</html>
AppManifest.xaml:
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
EntryPointAssembly="SilverlightApplication3"
EntryPointType="SilverlightApplication3.App"
RuntimeVersion="2.0.31005.0">
<Deployment.Parts>
<AssemblyPart x:Name="SilverlightApplication3" Source="SilverlightApplication3.dll" />
</Deployment.Parts>
</Deployment>
Это exe-шник, но с расширением XAP, SilverlightApplication3.xap:

Про этот EXE-шник точнее XAP можно почитать тут https://www.oreilly.com/library/view/pro-business-applicat..., машинный перевод:
Понимание файлов XAPКогда вы собираете проект Silverlight, все объединяется в один файл с расширением .XAP. Этот файл содержит сборки и любые другие файлы контента, связанные с проектом, которые объединяются и сжаты с использованием формата файла Zip. Вы можете доказать это, просто изменив расширение файла с .XAP на .zip и разобщив файл, чтобы осмотреть его содержимое. Файл XAP может быть размещен на веб -сервере, что позволяет загружать его и запускать клиентские компьютеры.
Моя ФЛ Он и Она4. Напишим такой код:
Забыл, а вот и XAML-код Page.xaml:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication3.Page"
Width="640" Height="480">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Height="16" HorizontalAlignment="Left" Margin="16,16,0,0"
VerticalAlignment="Top" Width="112" Text="Введите ваше имя:" TextWrapping="Wrap"/>
<TextBox Height="24" HorizontalAlignment="Left" Margin="16,40,0,0"
VerticalAlignment="Top" Width="224" Text="" TextWrapping="Wrap" x:Name="txtYourName"/>
<Button Height="24" HorizontalAlignment="Left" Margin="16,80,0,0"
VerticalAlignment="Top" Width="72" Content="Скажи имя!
" x:Name="btnSayName"
Click="btnSayName_Click"/>
</Grid>
</UserControl>
App.xaml:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication3.App">
<Application.Resources>
<!-- Resources scoped at the Application
level should be defined here. -->
</Application.Resources>
</Application>
P.S.:
Сейчас я ужинаю, ем вот такие пельмени из индейки, ням-ням!
Моя ФЛ Он и Она