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. Это даст вам возможность вращать двумерные объекты в трехмерном пространстве.

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>

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>

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

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(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>

Использованные материалы

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

Реклама

автомобильные шины