Silverlight: Советы
ImageOpened
В старых версиях Silverlight было трудно определить момент, когда изображение полностью загружено. Это событие чаще всего использовалось, чтобы получить реальные размеры картинки. А возникала эта проблема из-за того, что 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)
}
Perspective 3D
Преобразования "Perspective 3D" теперь могут быть применены в элементах управления Silverlight при помощи свойства PlaneProjection. Это даст вам возможность вращать двумерные объекты в трехмерном пространстве.
Пример ниже демонстрирует, как это делать:
<Image Source="Man.png">
<Image.Projection>
<PlaneProjection RotationX="45"></PlaneProjection>
</Image.Projection>
</Image>
Pixel Shaders
Шейдеры позволяют применять различные эффекты к изображениям. По умолчанию поддерживаются два встроенных эффекта: Drop Shadow (тени) и Blur (размывание). В дополнение к ним, вы можете создавать и использовать собственные эффекты.
Следующие изображения демонстрируют применение пиксельных шейдеров к ним.
Пример кода по применению встроенного шейдера:
<Image Source="dwarf.jpg">
<Image.Effect>
<BlurEffect></BlurEffect>
</Image.Effect>
</Image>
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();
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>
Результат (обратите внимание на белый цвет каретки):
Локальное подключение
Эта возможность позволяет двум различным приложениям 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(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. Данная возможность позволит вам правильно подбирать цвета в соответствии с пользовательскими настройками.
Использование строковых ресурсов
Очень удобно размещать строковые константы в ресурсах проекта. Эта практика является общепринятой при разработке и упрощает управление строковыми ресурсами вашего приложения.
Откройте файл App.xaml и добавьте ссылку на библиотеку MSCORLIB.
<Application xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml xmlns:clr="clr-namespace:System;assembly=mscorlib" x:Class="TestApp.App">
Далее в этом же файле найдите раздел Application.Resources и добавьте свои строковые ресурсы. Для примера я добавил один строковый ресурс, доступ к которому осуществляется посредством ключа "Cat" (вы можете выбрать свой).
<Application.Resources>
<clr:String x:Key="Cat">Рыжик</clr:String>
</Application.Resources>
Теперь откройте файл Page.xaml и добавьте объект TextBlock. Привяжите текст этого объекта к строковому ресурсу, который вы только что добавили, при помощи конструкции Text = "{StaticResource Cat}":
<TextBlock Text="{StaticResource Cat}"></TextBlock>

