Из блога Майка Сноу. Новые возможности Silverlight 3 бета 1.

Думаю, вы уже слышали о том, что вышла версия бета 1 Silverlight 3. Если вы еще не установили ее, то можете сделать это отсюда: https://silverlight.net/getstarted/silverlight3/default.aspx.

Этот релиз содержит массу новых великолепных возможностей. Если вы занимаетесь разработкой игр, то будете им рады.

ImageOpened.

В версии Silverlight 2 было трудно определить момент, когда изображение полностью загружено. Это событие чаще всего использовалось, чтобы получить реальные размеры картинки. А возникала эта проблема из-за того, что DownloadProgress указывал на 100% до того, как изображение было полностью декодировано. Чтобы ее решить, было добавлено новое событие ImageOpened. Пример:

 private void LoadImage(string fileName)
 {
     Image img = new Image();
     Uri uri = new Uri(fileName, UriKind.Relative);
     img.Source = new System.Windows.Media.Imaging.BitmapImage(uri);
     img.ImageOpened += new EventHandler<RoutedEventArgs>(Image_ImageOpened);
 }
  
 void Image_ImageOpened(object sender, RoutedEventArgs e)
 {
     Image img = (Image)sender;
     BitmapImage bi = (BitmapImage)img.Source;
     double width = bi.PixelWidth;
     double height = bi.PixelWidth != _radius)
 }

Сжатие XAP.

Была проделана большая работа по значительному уменьшению размеров XAP-файлов. Теперь их размер соизмерим (или лучше), как при сжатии средствами Windows. Игры часто содержат массу ресурсов, поэтому уменьшение размеров XAP-файлов ускорит загрузку ваших игр пользователями.

Perspective 3D.

Преобразования "Perspective 3D" теперь могут быть применены в элементах управления Silverlight при помощи свойства PlaneProjection. Это даст вам возможность вращать двумерные объекты в трехмерном пространстве.

Perspective 3D

Пример ниже демонстрирует, как это делать:

 <Image Source="Man.png">
     <Image.Projection>
         <PlaneProjection RotationX="45"></PlaneProjection>
     </Image.Projection>
 </Image>

Pixel Shaders.

Шейдеры позволяют применять различные эффекты к изображениям. По умолчанию поддерживаются два встроенных эффекта: Drop Shadow (тени) и Blur (размывание). В дополнение к ним, вы можете создавать и использовать собственные эффекты.

Следующие изображения демонстрируют применение пиксельных шейдеров к ним.

Pixel Shaders

Пример кода по применению встроенного шейдера:

 <Image Source="dwarf.jpg">
     <Image.Effect>
         <BlurEffect></BlurEffect>
     </Image.Effect>
 </Image>

Binding.

Теперь вы можете связывать свойства элементов управления друг с другом. Например, свойство Text объекта TextBlock может быть связано со свойством Text объекта TextBox. Или TextBox Text может быть привязан к свойству Value объекта Slider. Пример:

 <StackPanel>
     <TextBox x:Name="UserText"></TextBox>            
     <TextBlock Text="{Binding Text, ElementName=UserText}"></TextBlock>
 </StackPanel>

Все, что будет вводиться в TextBox, автоматически отразится в TextBlock.

Bitmap API.

Доступ к Bitmap API осуществляется при помощи класса WritableBitmap. Этот способ использует в качестве параметров ширину, высоту и формат пикселя.

Пример кода:

 WriteableBitmap wb = new WriteableBitmap(0, 0, PixelFormats.Bgr32);
 wb.Render(img, new ScaleTransform());
 wb.Lock();
 // walk through WriteableBitmap[]
 wb.Invalidate();
 wb.Unlock();

Графические ускорители.

Silverlight теперь использует GPU (Graphics Processing Unit) для целей визуализации, что освобождает центральный процессор для других задач. GPU обычно находится на видео карте. Он является самостоятельным графическим модулем, используемым для различных задач, например, для вычислений с плавающей точкой.

Улучшение производительности текстовой анимации.

Свойство TextRenderingMode теперь может принимать значение RenderForAnimation. При этом выключается оптимизация, которая может негативно влиять на текстовые эффекты, такие, как расслаивание, вращение и др. В итоге анимация становится более плавной. Пример использования этого свойства:

 RenderOptions.SetTextRenderingMode(MyTextbox, TextRenderingMode.RenderForAnimation);

Network Monitoring API.

Теперь появилось API, позволяющее отслеживать состояние подключения к сети. Для проверки доступности сети, вы можете вызвать следующую функцию:

 bool isConnected = NetworkInterface.GetIsNetworkAvailable();

Кроме того, вы можете использовать событие, которое будет вызвано, когда состояние сети изменится:

 NetworkChange.NetworkAddressChanged += 
new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

Эти функции находятся в пространстве имен System.Net.NetworkInformation.

SaveFileDialog.

Наконец-то мы можем сохранять файлы из приложений Silverlight! Использование этого метода вызовет диалог, позволяющий указать путь к файлу. Метод вернет объект Stream, который вы можете использовать для записи. Пример кода:

 SaveFileDialog sfd = new SaveFileDialog();
 sfd.Filter = "map files (*.xml)|*.xml|All files (*.*)|*.*";
 sfd.ShowDialog();
 System.IO.Stream stream = sfd.OpenFile();
  
 // Save your data here
  
 stream.Flush();
 stream.Close();

Не забудьте вызвать Flush и Close, иначе файл не будет создан.

CaretBrush.

При помощи этого свойства, вы можете изменить вид каретки. Проблема возникала при использовании черного цвета фона в текстовом поле. При этом курсор оставался черным и был невидим. Пример использования:

 <TextBox Foreground="White" Background="Black" Width="200" Text="Hello">
     <TextBox.CaretBrush>
         <SolidColorBrush Color="White"></SolidColorBrush>
     </TextBox.CaretBrush>
 </TextBox>

Результат (обратите внимание на белый цвет каретки):

CaretBrush

Локальное подключение.

Эта возможность позволяет двум различным приложениям Silverlight обмениваться информацией напрямую, минуя сервер.

Использование этой функциональности достаточно просто. Начните с создания двух независимых приложений Silverlight. К одному добавьте следующий код, ожидающий прихода сообщения:

 LocalMessageReceiver receiver = new LocalMessageReceiver("R2D2");
 receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
 receiver.Listen();

Вам будет необходимо сослаться на System.Windows.Messaging, чтобы выполнить эти вызовы. Конструктор LocalMessageReceiver принимает любой уникальный идентификатор.

К другому – добавьте код, как показано ниже, который предназначен для отправки сообщения первому приложению:

 LocalMessageSender sender = new LocalMessageSender("R2D2");
 sender.SendCompleted += new EventHandler<SendCompletedEventArgs>(sender_SendCompleted);
 sender.SendAsync("Hello World!");

Навигация.

Навигация теперь поддерживается в Silverlight. Это позволяет вам перехватывать события, генерируемые кнопками браузера "Вперед" и "Назад". Для этого типа приложений был создан новый шаблон "Silverlight Navigation Application".

В сущности, чтобы воспользоваться навигацией, вам нужно поместить вашу главную страницу в <navigation:Frame>. История сохраняется при помощи следующего вызова:

this.Frame.Navigate(new Uri(currentPage, UriKind.Relative));

Затем, при нажатии кнопок браузера "Вперед" и "Назад", этот объект будет перехватывать данные события, и вызывать нужную страницу.

Системные цвета.

Теперь вы можете обращаться к системным цветам, объявленным в пользовательских настройках. Доступ осуществляется при помощи System.Windows.SystemColors.*. Например: System.Windows.SystemColors.ActiveBorderColor. Данная возможность позволит вам правильно подбирать цвета в соответствии с пользовательскими настройками.

Другие возможности.

  1. Возможность запускать приложения Silverlight вне браузера, как обычную программу.
  2. Кэширование сборок – включает кэширование второстепенных расширений.
  3. Хранение ресурсов в собственных файлах.
  4. Новые элементы управления.
  5. Поддержка H.264/AAC.
  6. Новые анимационные эффекты, более плавную трансформацию.
  7. Получение данных о пользовательских предпочтениях. Эта информация может передаваться на один или более серверов для последующего анализа.

Выдержка из блога Майка Сноуссылка на оригинал

Авторские права Майка Сноу. Переведено с разрешения Майка Сноу.

Technorati Tags: Silverlight