Архив Сентябрь 2011
«Почему не работает гребаный border-radius» или Накипело.
Коллеги, хочу сразу отметить, что все примеры в своих статьях я пишу лично. Согласен, что выглядят они туповато, но вставлять кусок кода в статью, не проверив его… Картинки я также НЕ рисую в Paint.
К чему это я. Ах да, некоторое время назад писал пост о возможности работы с border-radius. Как ни странно, Internet Explorer 9 единственный браузер, который правильно работает с данными атрибутами. Если же говорить об IE 10, то мы обогнали всех. Достаточно посмотреть на результаты тестов: http://samples.msdn.microsoft.com/ietestcenter/. Как видно, основные конкуренты остались позади. Но я более чем уверен, что они догонят IE 10 в самое ближайшее время, а, следовательно, эра HTML 5 началась. И это очень здорово! Хотя и удивляет то, что конкуренты особо и не чухались, до появления поддержки HTML 5 в IE. Ведь декларация поддержки HTML 5 идет не первый год, а кроме video элемента толком ничего и не было.
Я опять отвлекся от темы. Так вот, прошло уже около года с момента публикации моего поста, а я до сих пор получаю гневные сообщения о том, что не работает border-radius в IE 9. Это конечно не так. Просто нужно быть внимательнее к тому коду, который Вы пишите. Если у меня что-то не получается, то я первым делом ругаю себя, а потом кого-то еще. Обычно нахожу ошибку именно у себя.
Что касается border-radius, то основная ошибка, которая тут возникает, это запуск страницы в режиме совместимости:
1). Проверьте, что страница декларирует использование HTML 5 с помощью элемента <DOCTYPE html>. В противном случае контент будет рассматриваться как HTML 4.x, а, следовательно, border-radius работать не будет;
2). Проверьте meta элементы на Вашей странице. Не переводят ли они браузер в режим совместимости? Возможно, Вы сами включили режим совместимости при тестировании других возможностей, нажав соответствующую кнопку возле строки-адреса страницы.
Иными словами, Internet Explorer позволяет отображать не только сайты, использующие все самые последние рекомендации, но и поддерживает ряд режимов совместимости, в которые можно принудительно переводить Ваши сайты, не модифицируя код.
Изучите предметную область, а потом делайте выводы.
А я начну писать статьи по HTML 5. Самое время.
Введение в Silverlight 5 (часть 4)
Перейдем к четвертой части (из семи) нашего рассказа о Silverlight 5. Рассмотрим улучшения при работе с текстом, печатью, а также возможность вызова нативных функций системы.
Работа с текстом
Silverlight 5 предлагает несколько интересных возможностей при работе с текстом.
Так, элементы управления Control, TextBlock и TextElement, имеют новое свойство CharacterSpacing. Это свойство позволяет установить расстояние между символами внутри текста.
Свойство LineHeight позволяет установить ширину строки (можно интерпретировать, как расстояние между строками) и определено в таких элементах как Block, TextBlock, TextBox и RichTextBox. Для элемента RichTextBox можно также задать стратегию с помощью свойства LineStackingStrategy. Ниже пример текста внутри элемента TextBlock с расстоянием между строками 30 и расстоянием между символами – 200:
Наконец, Silverlight 5 стал поддерживать два новых текстовых элемента, это RichTextBlock и RichTextBlockOverflow. Эти элементы аналогичны элементам RichTextBox и RichTextBoxOverflow, но позволяют отображать текст только на чтение.
Для тех, кто еще не познакомился с элементом RichTextBlockOverflow, рассмотрим небольшой пример:
1: <StackPanel x:Name="LayoutRoot" Background="White"
2: Orientation="Horizontal" VerticalAlignment="Top">
3: <RichTextBlock
4: Width="250" FontSize="16" OverflowContentTarget=
5: "{Binding ElementName=SecondBox}">
6: <Paragraph>
7: В лесу родилась елочка,
8: </Paragraph>
9: . . . . . . . . //повторить 20 разJ
10: </RichTextBlock>
11:
12: <RichTextBlockOverflow Width="250" Name="SecondBox">
13: </RichTextBlockOverflow>
14: </StackPanel>
Результат работы этого кода показан ниже:
Как видно, RichTextBlockOverflow может отображать текст, который не «вмещается» в основной элемент RichTextBlock. Благодаря таким элементам мы можем азмещать текст в 2, 3 и более колонках (или реализовывать более сложные сценарии).
Печать
Silverlight 5 позволяет теперь не только реализовать растровую, но и векторную печать. Для этих целей используется все тот же метод Print класса PrintDocument, который осуществляет попытку печати в векторном формате, а в случае неудачи (принтер не поддерживает), перейти к печати в растровом виде. Растровую печать можно инициировать с помощью нового метода PrintBitmap.
PInvoke
В документации эта возможность пока не описана, но я знал, что она уже реализована – возможность вызова методов Windows API из Silverlight приложений, обладающих повышенными полномочиями. Причем речь идет о приложениях, которые работают как в браузере, так и вне браузера. Поскольку вызов нативных функций в .NET обычно осуществляется с помощью атрибута DllImport, то я решил попробовать этот механизм и тут (запустив приложение с повышенными привилегиями):
1: public partial class MainPage : UserControl
2: {
3: [DllImport("user32.dll", CharSet = CharSet.Unicode)]
4: public static extern int MessageBox(IntPtr hWnd,
5: String text, String caption, uint type);
6:
7: public MainPage()
8: {
9: MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
10: InitializeComponent();
11: }
12: }
Удивительно то, что оно заработало. На экране, поверх браузера я увидел стандартный MessageBox. Пользуйтесь!
Введение в Silverlight 5 (часть 3)
Продолжаем рассматривать новые возможности Silverlight 5, тем более, что вчера появился Release Candidate. Прежде чем перейти к 3D и связыванию с данными, рассмотрим массу небольших нововведений, которые могут сделать жизнь разработчика более приятной.
Установка имени файла по умолчанию в SaveFileDialog
Начнем сегодняшний обзор с улучшений в элементе управления SaveFileDialog. Теперь при вызове этого диалогового окна, можно установить имя файла (как и список расширений), которое будет отображаться по умолчанию, как имя файла, предлагаемого для записи. Вот как это выглядит:
SaveFileDialog dialog = new SaveFileDialog();
dialog.DefaultFileName = "hello.txt";
dialog.ShowDialog();
Кроме описанной возможности, появилось свойство InitialDirectory, позволяющее задать директорию, которая будет открыта в диалоге по умолчанию.
Улучшение работы с аудио
В Silverlight 5 стала доступна библиотека по работе с Media. Классы этой библиотеки представлены пространством имен Microsoft.Xna.Framework.Audio. Нетрудно догадаться, что данный шаг выполнен в рамках интеграции с XNA библиотеками, которые можно использовать и в Silverlight (это аудио и 3D).
Новое пространство имен содержит два основных класса, позволяющих создавать аудио эффекты в процессе работы Silverlight приложения. Файлы, доступные для проигрывания, должны быть в формате WAV и могут быть загружены с помощью класса SoundEffect. Конструктор этого класса получает ссылку на набор данных и(или) настройки аудио.
Создание конкретного экземпляра можно также выполнить с помощью статического метода FromStream, получающего ссылку на поток в качестве параметров.
Проигрывание эффекта осуществляется с помощью метода Play. Каких-то других методов SoundEffect не имеет, но это вовсе не означает, что отдельно взятым объектом нельзя управлять. Так, если Вы хотите не просто воспроизвести эффект, но и добавить элементы управления аудио (громкость, пауза и т .д.), то вместо метода Play следует вызывать метод CreateInstance, создающий конкретный экземпляр на базе SoundEffect, и возвращающий ссылку типа SoundEffectInstance, которая позволит управлять нашим аудио файлом.
SoundEffect sEffect=SoundEffect.FromStream(streamInfo.Stream);
sEffect.Play();
Изменение скорости проигрывания медиа
В Silverlight 5 произошли улучшения и в MediaElement элементе. Теперь этот элемент управления содержит такое свойство как PlaybackRate и событие RateChanged. Свойство позволяет задавать скорость проигрывания видео, а событие – реагировать на изменение свойства.
Нужно отметить, что при тестировании свойства у меня проявилась странная бага в дизайнере: при изменении свойства PlaybackRate через окно свойств, оно остается неизменным, показывая значение 1. При этом в XAML файле оно модифицируется, как и положено.
Возможно, это только моя проблема (какие версии я тут только не ставил), но будьте готовы к такому поведению.
Поддержка пульта дистанционного управления
Не было возможности проверить данную функциональность, так как пульт к Media Center у меня отсутствует (или к Xbox), но, теоретически Silverlight 5 поддерживает и работу с пультом. Данная функциональность стала доступна благодаря поддержке события MediaCommand, которое доступно у всех UIElement. Иными словами, если Вы хотите обрабатывать нажатия кнопок пульта, то Вам следует обработать это событие у родительского контейнера (от дочерних элементов оно как раз туда и свалится). Чтобы понять, какая кнопка на пульте была нажата, обработчик события получает доступ к свойству в MediaCommandEventArgs, содержащему свойство перечислимого типа MediaCommand. Последнее и содержит информацию по нажатой кнопке.
UNETA+ – всем сюда!
Очень удивляет и радует конференция, организуемая сообществом .NET разработчиков в городе Харькове. Им удалось собрать неимоверное количество русскоязычных докладчиков со всего мира. При этом, сюда приедут как уже известные в Украине докладчики (например, Дмитрий Никонов), так и свежие силы в виде Вячеслава Красовского, Владимира Юнева и др.
Очень хорошо знаю, что на такие жесткие технические конференции кого-то из-за рубежа притащить очень тяжело (в отличие от конференций ни о чем, где люди сами себя пиарят). Ведь это те самые люди, которые разрабатывают Azure, SQL Server и расширения для Windows Phone и работы у них много. Их даже в Киев тяжело вывезти, имея связи в Майкрософт.
В общем, идти всем! Регистрация доступна тут http://uneta.ua/.
