Хранение данных приложения в Windows 8

Пока приложение из Windows 8 Store запущено вы хотите хранить данные все время. После того как пользователь переключится на другое приложение в любое время и вы имеете только пять секунд для сохранения данных в этот момент.

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

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

Читать полностью »

09.02.2013

Создание отличных кнопок для app bar Windows 8

У приложений из Windows 8 Store большая часть навигации вынесена в AppBar. Хороший AppBar имеет кнопки, которые можно легко нажать и определить их назначение.

Вы можете создать свое собственное изображение, но зачастую этого не нужно делать. Вместо этого вы можете использовать более 150-ти вариантов AppBarButtonStyle из файла StandardStyles.xaml. Они закомментированы по умолчанию, но вы можете их просто раскомментировать и с легкостью использовать.

Читать полностью »

05.02.2013

#731 – Основная идея Multi-Touch

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

Мультитач обычно используется для отслеживания жестов пользователя с использованием более одного пальца. Например, поместите два пальца на экран и разведите их в стороны, что будет интерпретировано как жест "zoom in" (увеличение). Движение двух пальцев друг к другу будет интерпретировано как жест "zoom out" (уменьшение). А поворот пальцев двух пальцев на экране одновременно будет интерпретировано как жест "rotate" (поворот).

Читать полностью »

10.01.2013

Утилита с исходным кодом Show Me The Templates!

Show Me The Templates представляет собой инструмент для изучения шаблонов штатных элементов управления WPF для всех 6 тем.

Не смотря на то, что утилита создана в 2007 году, она остается актуальной и без проблем собирается Visual Studio 2010.

Скачать архив с исходным кодом.

Оригинал: Show Me The Templates!

10.01.2013

#713 Установка курсора в виде изображения из UIElement при перетаскивании

Вы можете использовать GiveFeedback для изменения курсора во время операции drag-and-drop. Вы можете пойти немного дальше и установить в качестве курсора картинку представляющую собой пользовательский элемент, который вы тащите, отобразив UIElement как картинку (bitmap) и потом конвертировав эту картинку в курсор.

Этот пример основан на коде написанном Brandon Cannaday, http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-custom-cursors. Для начал здесь приводится код Brandon измененный читателем "Swythan":

Читать полностью »

17.12.2012

#712 – Показ пользовательского курсора мыши при перетаскивании

Вы можете использовать свой курсор во время операции drag-and-drop установив обработчик на событие GiveFeedback.

В примере ниже мы загружаем пользовательский курсор из файла .cur расположенного в директории запуска приложения.

Читать полностью »

14.12.2012

#711 – Изменение курсора мыши во время перетаскивания

Вы можете изменять курсор мыши в процессе операции drag-and-drop обрабатывая событие GiveFeedback для drag источника. Свойство GiveFeedbackEventArgs.Effects показывает текущее действие в зависимости от позиции мыши. Вы можете установить курсор мыши, основываясь на текущем действии.

В примере ниже, мы меняем курсор мыши с "hand" для типа действия Copy, которые показывает разрешение для бросания данных.

Читать полностью »

13.12.2012

#707 – Перетаскивание списка элементов из приложения WPF в Excel

Вы можете перетаскивать данные из WPF в виде списка значений разделенных запятыми в Excel. Когда вы перетащили список CSV в Excel, то каждый элемент будет вставлен в отдельную ячейку.

В примере ниже мы имеем список элементов в контроле ListBox.

Мы можем перетаскивать элементы списка, подписавшись на событие MouseLeftButtonDown для элемента с надписью с голубым фоном. Мы создаем строку, содержащую элементы списка, разделенные запятой. Затем мы создаем DataObject с типом формата CommaSeparatedValue.

Читать полностью »

07.12.2012

#706 – Перетаскивание элементов пользовательского интерфейса между приложениями

Вы можете перетаскивать интерфейсы пользовательского интерфейса между приложениями WPF используя drag and drop. Для того чтобы это сделать надо прочитать XAML представление из логического дерева для части которую вы хотите перетащить и указать XAML как формат данных.

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

На отправляющей стороне XamlWriter объект сохраняет XAML представление в виде строки.

Читать полностью »

06.12.2012

#686 – Используем анимацию для создания пульсирующей картинки

Вы можете анимировать прозрачность элемента Image для создания эффекта пульсации. Ниже приведен один пример как это сделать использую Storyboard. Мы анимируем картинку используя свойство Opacity, уменьшая его н а 10% через каждые пол секунды и возвращая обратно.

Читать полностью »

08.11.2012

Создание Live Tile

Продолжая серию статей в блоге сегодня я покажу, как создать Live Tile (живые тайлы они же живые плитки).

Живые тайлы показывают пользователю, что интересного случилось в вашем приложении или если у вас есть новая информация для него.

Живые тайлы это существенная и интересная часть Windows 8 и их не очень трудно создавать. По правде создание живого тайла очень простое дело.

Читать полностью »

24.09.2012

Поиск в Windows 8

Приложения для Windows 8 Store Applications могут воспользоваться общими "прелестями", что когда вы делаете жест в правом углу Windows 8 устройства (или нажали Win-C). Верх очарования это поиск и он обеспечивает огромную функциональность при относительно небольших усилиях программирования.

Когда вы нажимаете на поиск в Windows 8 предполагается, что вы хотите найти конкретное приложение, если это приложение имеет зарегистрированный поисковый "контракт". Если его нет, Windows 8 предполагает, что вы хотите найти приложения, как показано на картинке.

Читать полностью »

12.09.2012

Начало работы с Caliburn.Micro под WinRT

Это счастливое время для разработчиков WinRT: встречайте Caliburn.Micro для WinRT. Основная часть (INPC, EventAggregator) была доступна в качестве превью с прошлого года, теперь Nigel Sampson и Keith Patto, проделали отличную работу и портировали остальной framework на WinRT. Далее короткая инструкция как начать с прицелом на тех, кто уже работал с предыдущей версией framework.

Читать полностью »

03.08.2012

#616 – Порядок возникновения события Initialized и Loaded для FrameworkElement

У всех элементов, которые наследуются (прямо или косвенно) от FrameworkElement возникают оба события Initialized и Loaded когда контрол загружается. Например, оба события Initialized и Loaded возникают для каждого контрола в вашем приложении, когда приложение загружается.

События Initialized, для всех контролов, возникают, начиная с низа логического дерева. Когда вы перехватываете событие Initialize для определенного элемента, то вы можете считать, что любой нижележащий элемент уже инициализирован.

Событие Loaded наоборот возникает с вершины логического дерева и распространяется вниз. События Loaded начинают возникать только после того как системный layout определил позицию и размер для каждого элемента в дереве. Так что в обработчике события Loaded вы можете считать, что все элементы в логическом дереве полностью настроены.

Оригинал: #616 – FrameworkElement.Initialized and Loaded Event Order

02.08.2012

#615 – Стандартные события жизненного цикла объекта FrameworkElement

Все объекты в WPF, которые наследуются от FrameworkElement или FrameworkContentElement имеют три основных события которые возникают в течении жизненного цикла элемента. Так как эти события наследуются от FrameworkElement или FrameworkContentElement, они доступны для всех контролов, layout панелей, объектов Window и объектов Page.

Три главных события жизненного цикла объекта:

  • Initialized – Возникает, когда объект был создан и все свойства установлены. Свойства, относящиеся к layout еще не были установлены
  • Loaded – Возникает после того как системный layout рассчитал все свойства относящиеся layout. Привязка данных уже случилась к этому моменту, поэтому контрол получил свои последние значения свойств.
  • Unloaded – Возникает, когда элемент удаляется из логического дерева. Не возникает при закрытии приложения.

Оригинал: #615 – Standard Object Lifetime Events for FrameworkElement Objects

01.08.2012

#567 – Установка связанных свойств Layout в Blend

Область панели Properties позволяет вам устанавливать связанные с разметкой контрола. Включает в себя свойства типа полей отступов, выравнивания, высоты, ширины и смещений.

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

Читать полностью »

28.05.2012

#557 – Использование элемента Image как маски прозрачности

Обычно вы используете градиентные кисти для маски прозрачности, изменяя прозрачность контрола постепенно.

Вы можете использовать изображение как кисть для прозрачности, делая разные области конечного контрола непрозрачными или прозрачными в зависимости от аналогичных мест на изображении.

Ниже я создал изображение смайлика в Paint.NET. Я сделал фон изображения прозрачным.

Читать полностью »

14.05.2012

#554 – Использование маски прозрачности

Маска прозрачности (Opacity Mask) позволяет вам установить прозрачность для элемента пользовательского интерфейса который основан на кисти, вместо установки единственно свойства прозрачности, которое применяется ко всему элементу.

Например, вместо установки единственного значения для свойства Opacity у контрола Image, вы можете использовать градиентную кисть как маску прозрачности, так что одна сторона картины исчезнет.

Мы начнем с простого Image с значение свойства Opacity по умолчанию (100%).

Читать полностью »

09.05.2012

Caliburn Micro Часть 5: Window Manager

И снова здравствуйте и добро пожаловать в следующую статью нашей серии уроков про Caliburn Micro. Это относительно простой урок на этот раз, мы будем рассматривать Window Manager. Прежде чем мы начнем, вот ссылки на предыдущие уроки в этой серии:

Многие из вас, кто играл с Caliburn Micro могут знать, что существует не так много упоминали о Window Manager. В связи с этим, я не буду рассказывать все о Window Manager, я просто объясню, что я знаю об этом. Чтобы продемонстрировать, как использовать Window Manager, мы будем расширять приложение, которое мы сделали в первом посте блога этой серии.

Читать полностью »

13.03.2012

#511 – Основы Blend – панель инструментов

Когда вы запустили Expression Blend, то вы видите ряды иконок в левом нижнем углу окна. Каждая иконка представляет инструмент, который вы можете использовать с элементами вашего приложения. Это область окна называется панель инструментов (Tools Panel).

Читать полностью »

09.03.2012

#510 – Заголовок Expander может быть любым

Свойство Header у контрола Expander не строкового типа. Вы можете установить любой объект и любой объект будет отображен сверху Expander, в любом случае свернут или развернут ли Expander.

В примере ниже, мы используем Image для заголовка Expander и GroupBox для контента.

Читать полностью »

08.03.2012

#507 – Expander контрол позволяет Развернуть/Свернуть набор контролов

Вы можете использовать Expander контрол для скрытия набора контролов. Когда вы нажимаете на Expander, скрытые контролы показываются. Когда вы нажимаете снова, то они исчезают опять.

Контрол Expander является ContentControl, поэтому содержит только единственный дочерний элемент. Обычно это контрол панели, чтобы вы могли добавить несколько контролов в панель.

Читать полностью »

05.03.2012

#497 – Использование UniformGrid для создания группы кнопок одинакового размера

Вы можете использовать StackPanel для придания ее дочерним элементам одинакового размера в одном из ее измерений. Это трудно сделать в другом измерении размера.

В примере ниже используется StackPanel для нескольких кнопок. Они одной высоты, но разной ширины.

Читать полностью »

17.02.2012

#496 – Использование StackPanel для создания группы кнопок одинакового размера

Зачастую вы хотите расположить группу кнопок в GUI по вертикали или горизонтали. Обычно используя StackPanel для этого.

Давайте предположим, что вы хотите серию кнопок расположенных вертикально с правой стороны окна.

Читать полностью »

16.02.2012

#492 – Разметка может изменяться во время выполнения

Преимущество flow-based разметки против coordinate-based в том, что элементы в пользовательском интерфейсе подстраивают размер под содержание. Дизайнер GUI не имеет явного задания размера и расположения для каждого дочернего элемента.

Разметка контейнеров в WPF не только позиционирует дочерние элементы в режиме дизайна, но переизмеряет и перестраивает размещение дочерних элементов, когда некоторые свойства дочерних элементов меняются. Например, если свойство Content у контрола Label изменится, то родительской контейнер обновит представление на новый текст.

В примере ниже, когда Label содержащий название фильма меняется кнопки сдвигаются вправо.

Читать полностью »

10.02.2012

Caliburn Micro Часть 4: Агрегатор событий

Для тех из вас, кто только присоединился к серии уроков, мы узнали о том, как использовать Caliburn Micro для создания приложений WPF с архитектурой MVVM. Caliburn Micro является фрейморком используемым для построения .NET приложений (WPF, Silverlight и Windows Phone 7) используя некоторые популярные UI паттерны, включая MVVM, MVP и MVC. Он предоставляет много полезных способов уменьшить объем работы, которые вам нужно сделать для выполнения общих задач, таких как создание привязок данных и перехват событий. Различные особенности Caliburn Micro позволяют легко иметь чистую связь между объектами модели и пользовательского интерфейса. Это означает, что ваше приложение легко тестируется и поддерживается. Вот ссылки на предыдущие статьи в блоге:

Читать полностью »

01.02.2012

#479 – Использование преобразования разметки над дочерними элементами в Canvas

Вы можете использовать LayoutTransform на дочерних элементах Canvas для преобразования их графического представления. Особенно вы можете использовать RotateTransform, ScaleTransform или SkewTransform.

Читать полностью »

24.01.2012

Caliburn Micro Часть 3: Дополнительно о событиях и их параметрах

До текущего момента в серии примеров по Caliburn Micro мы рассмотрели как начать использовать Caliburn Micro в WPF приложении и как связать представление? с моделью вместе используя привязку и события. В сегодняшнем примере мы рассмотрим более продвинутые возможности обработки событий и указание параметров события. Для эксперимента с этими возможностями мы расширим приложение, сделанное в предыдущих статьях.

Возможно, вы помните по предыдущим статьям, что мы привязывались к событиям с помощью соглашений именования Caliburn Micro. Все что нам надо было это задать имя кнопки в представлении таким же, как и имя метода в модели представления. Когда событие Click происходило для кнопки, то это автоматически связывало его с вызовом соответствующего метода. Иногда вам нужно однозначно привязаться к событию для передачи параметров или указать какое точно событие вы хотите использовать. Для этого Caliburn Micro предоставляет расширенный и короткий синтаксис. Преимущество расширенного синтаксиса в совместимости с Microsoft Expression Blend. Короткий синтаксис лучше, если вам не нужно использовать дизайнер и вы хотите краткости и простоты. Давайте начнем с изучения как использовать расширенный синтаксис.

Читать полностью »

24.01.2012

Caliburn Micro Часть 2: Привязка данных и события

В моей предыдущей статье я показал вам как начать использовать Caliburn Micro Framework в приложениях WPF. Caliburn Micro помогает реализовать приложения используя MVVM паттерн дизайна, чтобы получить четкое разделение между представлением и моделью данных. В этой статье мы рассмотрим, как Caliburn Micro помогает нам с привязкой данных и событиями. Мы построим в итоге приложение, проиллюстрированное в прошлой статье и с добавлением некоторого простого взаимодействия с пользователем и отображением данных.

Привязка данных

Мы начнем с приложения отображающего значения цифр, которые хранятся в модели. В классе AppViewModel, созданном в предыдущей статье, добавим свойство с названием Count, как показано во фрагменте кода ниже. Значение свойства хранится в поле _count которому мы присвоим значение по умолчанию равное 50. Как вы можете помнить с прошлого раза мы сделали класс AppViewModel наследником PropertyChangedBase, который предоставлен Caliburn Micro для уведомления о изменившихся свойствах. Вместо реализации INotifyPropertyChanged в каждой модели, вы можете просто вызвать метод NotifyOfPropertyChange внутри сеттера вашего свойства.

Читать полностью »

16.01.2012

#472 – Распределение площади UniformGrid по умолчанию

Вы обычно устанавливаете число строк и колонок UniformGrid используя Rows и Columns свойства. Вы также можете пропустить эти свойства и UniformGrid установит число строк и колонок основываясь на количестве дочерних элементов.

UniformGrid пытается создать площадь разметки, автоматически устанавливая число строк и колонок как в списке ниже:

  • 1 элемент – 1 строка, 1 колонка
  • 2-4 элементов – 2 строки, 2 колонки
  • 5-9 элементов – 3 строки, 3 колонки
  • 10-16 элементов – 4 строки, 4 колонки
  • И так далее

Обратите внимание, что UniformGrid в этом случае всегда имеет тоже число строк и колонок.

Читать полностью »

13.01.2012

Caliburn Micro Часть 1: Начало

В этой статье я покажу простой пример для начала работы с использованием Caliburn Micro в WPF приложении. Это всего лишь первая часть из серии, которые я напишу и надеюсь вы подпишитесь и и проследите как мы построим полезное приложение.

Шаг 1: Начало

Caliburn Micro использует .NET framework 4.0, так что вам понадобится Visual Studio 2010 для создания приложения. Начните с создания нового проекта типа "WPF Application" и добавьте ссылки на Caliburn.Micro.dll и System.Windows.Interactivity.dll которые у вас будут после скачивания Caliburn Micro. Так как Caliburn Micro позаботится о создании окна за вас, то удалите файл MainWindow.xaml и уберите атрибут StartupUri из файла App.xaml. App.xaml теперь должен выглядеть так:

Читать полностью »

12.01.2012

#469 – Заполнение UniformGrid справо налево

UniformGrid обычно располагает свои дочерние элементы слева на право, начиная с первой строки (сверху вниз, слева направо). Вы можете изменить поведение, используя свойство FlowDirection.

По умолчанию значение для FlowDirection является LeftToRight. Если вы укажите значение RightToLeft, то UniformGrid будет заполнять дочерние элементы справа налево в каждой строке (Строки все также будут заполняться сверху вниз).

Читать полностью »

10.01.2012

#468 – Свойство FirstColumn позволяет получить пустые ячейки в UniformGrid

UniformGrid содержит дочерние элементы в порядке, в котором они появляются в файле XAML где UniformGrid определен. Они располагаются в первой строке (слева на право) пока строка не заполнится и не начнется вторая строка.

Дочерний элемент обычно появляется в первой колонке первой строки. Вместо этого вы можете сделать, чтоб первый элемент появился в другой колонке, указав значение свойства FirstColumn. Это свойство указывает начинающийся с 0 номер колонки, где должен появится первый элемент. Дочерние элементы продолжают заполнять соответствующие колонки в первой строке и продолжаются во вторую, когда первая заполнится.

Читать полностью »

09.01.2012

#467 – Использование UniformGrid для равномерного распределения строк и колонок

Панель разметки UniformGrid похожа на Grid, тем что дочерние элементы располагаются в строках и колонках. Но разница с Grid в том:

  • Вы не указываете никакой информации о размерах для каждой строки и колонки
  • Все колонки одной ширины
  • Все строки одной высоты
  • Вы указываете желаемое количество строк и колонок
  • Вы не указываете строку и колонку для дочерних элементов

Дочерние элементы автоматически размещаются последовательно в ячейках грида. Каждая строка заполняется слева на право, начиная с первой строки.

Читать полностью »

06.01.2012

#454 – UseLayoutRounding против SnapsToDevicePixels

Класс UIElement имеет SnapsToDevicePixels свойство для контроля пиксельного выравнивания. Когда установлено в true для самого верхнего по уровню элемента, все дочерние элементы выравниваются по пиксельным границам, для избегания сглаживания (антиалиазинга).

В .NET 4.0, класс FrameworkElement получил свойство UseLayoutRounding, которое также предотвращает сглаживание (анитиалиасинг) выравниванием по аппаратным пикселям.

Читать полностью »

21.12.2011

#453 – Свойство UseLayoutRounding выравнивает части по пиксельным границам

Потому что WPF позиционирует GUI элементы используя машинно независимые единицы, маленькие GUI элементы могут выглядеть нечеткими при отображении за счет сглаживания (антиалиасинга).

Обратите внимание что края элементов Border немного размыты в примере ниже. Каждый элемент должен быть шириной в 2 на этом устройстве, но сглаживание приводит к нечеткости краев.

Читать полностью »

20.12.2011

#447 – Вы можете использовать преобразования разметки с DockPanel

Вы можете использовать LayoutTransform индивидуально для каждого дочернего элемента в контейнере DockPanel для масштабирования или поворота элементов.

В примере ниже у нас есть четыре контрола Label, каждый пристыкован к одной из сторон DockPanel. Надпись слева, сверху, справа используют LayoutTransform повернуть их наружу.

Читать полностью »

10.12.2011

#434 – Режим Canvas Layout в Blend

По умолчанию во время редактирования Grid в Blend отступы сохраняются, когда вы изменяете разметку Grid, но визуальное представление контролов может меняться. Это состояние называется режим сеточной разметки и индицируется маленькой иконкой в верхнем левом углу Grid в дизайн пространстве.

Читать полностью »

21.11.2011

#433 – Сохранение отступов во время редактирования Grid в Blend

Если у вас есть простой Grid 2x2 и вы используете для дизайнерское пространство Blend для размещения Button в Grid'е. Если поместить Button перетаскиванием, ее свойства Grid.Row и Grid.Column будут установлены соответственно и ее Margin будет установлен в соответствии с местом куда вы бросите кнопку.

Читать полностью »

18.11.2011

#429 – Свойства дочерних элементов которые влияют на разметку

Панели разметки, такие как StackPanel и Grid, служат контейнерами дочерним элементам, чей тип UIElement (В реальности большинство дочерних элементов наследуются от FrameworkElement в свою очередь наследуется от UIElement).

Панели разметки соблюдают значения следующих свойств их дочерних элементов. Все эти свойства определены в FrameworkElement.

Читать полностью »

15.11.2011

#428 – Прочие настройки Layout в Blend

Вы можете использовать окно настроек в Blend для установки любых свойств контрола расположенного в layout контейнере, включая layout зависимые свойства.

Для примера считаем, что имеем Grid содержащий пару контролов Button. Если нажать на одну из кнопок, то вы увидите ее свойства в окне свойств справа в интерфейсе дизайнера.

Читать полностью »

11.11.2011

#426 – Панели разметки имеют поля отступа

Обычно установка полей отступа элементов содержащихся внутри панели разметки делается для создания пустого пространства между различными элементами и созданием пустого пространства между элементом и краями панели.

Вот окно, содержащее Grid (бежевый фон), который содержит несколько контролов. Без установке полей отступа.

Читать полностью »

10.11.2011

#423 – Установка максимального Height и Width в Rows и Columns для Grid

Аналогично как вы устанавливаете минимум для ширины и высоты строки и колонки в Grid, вы можете установить максимум для высоты и ширины.

Вы можете установить максимум высоты строки в Grid используя свойство MaxHeight для элементы RowDefinition. Вы можете установить максимум ширины колонки, используя свойство MaxWidth для элементы ColumnDefinition.

Читать полностью »

04.11.2011

#422 – Установка минимального Height и Width в Rows и Columns для Grid

Вы можете установить минимальную высоту для строки в Grid, используя свойство MinHeight. Вы также можете установить минимальную ширину колонки используя свойство MinWidth.

В примере ниже мы установили минимальную ширину первой колонки, даже если значение свойства Width установлено в Auto. Мы также установили минимум для 4-й колонки, ширина которой установлена в 1* (аналогично ширине 3-й конки).

Читать полностью »

03.11.2011

#399 – WrapPanel изменяет разметку потомков, когда изменяются их размеры

Мы видели что WrapPanel располагает свои дочерние элементы по горизонтали, заполняя за раз по строке или по вертикале, заполняя за раз по колонке.

WrapPanel так же пересчитывает разметку своих дочерних элементов, в то время как размер самой WrapPanel изменяется. В этом случае расположение дочерних элементов изменяется.

Предположим, что у нас есть WrapPanel у которой свойство Orientation установлено в значение Horizontal. Это расположит дочерние элементы слева на право, на первой строке и начнет вторую строку как только первая заполнится.

Читать полностью »

03.10.2011

#398 – Элемент WrapPanel

Элемент WrapPanel служит контейнером для коллекции дочерних элементов, располагая свои дочерние элементы одним из двух способов:

  • В горизонтальной ориентации (по умолчанию). Дочерние элементы добавляются слева на право, пока строка не заполнится и потом переносятся на следующую строку
  • В вертикальной ориентации. Дочерние элементы добавляются сверху вниз, пока колонка не заполнится и затем переносятся на следующую колонку

Читать полностью »

30.09.2011

#392 – Использование свойства SnapsToDevicePixels для предотвращения антиалиасинга

Потому что WPF позиционирует GUI элементы, используя машинно-независимые единицы, маленькие GUI элементы могут выглядеть нечеткими при отображении за счет сглаживания (антиалиасинга).

Обратите внимание не согласованный (не одинаковый) внешний вид вертикальных линий в примере ниже. Каждая линия должна быть одинакового размера, так как мы определили ее в 1 WPF unit шириной (1 пиксель на 96 dpi).

Читать полностью »

22.09.2011

#391 – Антиалиасинг может привести к нечеткому отображению GUI элементов

Вы определяете позицию и размер для GUI элементов в WPF используя машинно независимые единица (device-independent units) В одной единице 1/96 дюйма или 1 пиксель на 96 dpi экране. Это позволяет объектам иметь постоянный физический размер, несмотря на разрешение.

Из за того что вы не указываете в терминах пикселей, края объектов не всегда выстраиваются в точности по пикселям. WPF использует антиалиасинг, когда отображает GUI элементы. Для примера, если элемент только занимает половину пикселя, то этот пиксель отображается в половину яркости.

Читать полностью »

21.09.2011

#388 – Разметка контейнеров не предоставляет скроллинг

Ни один из контролов панелей WPF (контейнеры) автоматически не обеспечивают прокрутку. Если их дочерние элементы не вписываются в доступное пространство, то дочерние контролы обрезаются.

В примере ниже мы у нас есть вертикальная StackPanel с серией контролов типа Label. Помните, что первая надпись не подстраивает под размер окна и прикреплена справа. Последняя надпись аналогично не подстраивается и прикреплена снизу окна.

Читать полностью »

15.09.2011

#387 – Установка цвета фона для того чтобы увидеть как работает разметка

Иногда сложно понять, как контейнер располагает свои дочерние элементы. Вы можете использовать свойство Background для каждого контрола или панели для получения лучшего представления об этих вещах.

Предположим у нас есть GUI который включает несколько элементов управления и две вложенные панели.

Читать полностью »

15.09.2011

#386 – Разметка = Панели + FrameworkElements + Alignment/Margins/Padding

Разметка в WPF это процесс, который определяет размер и позиции всех элементов пользовательского интерфейса.

Пользовательский интерфейс состоит из внешнего Window или Page которые содержат иерархию элементов пользовательского интерфейса. Иерархия может содержать личные элементы пользовательского интерфейса или панели, которые по очереди содержат коллекцию дочерних FrameworkElements.

Panel это абстрактный класс, который служит родительским для конкретных панелей разметки, включая Canvas, DockPanel, Grid, StackPanel и WrapPanel.

Читать полностью »

14.09.2011

#385 – Вы можете вкладывать панели контролов

Обычно приложение состоит из верхнего контрола типа панель, который содержит другие, создавая иерархию панелей, которая определяет разметку вашего GUI.

В примере на самом верхнем уровне расположен трех строчный Grid, который содержит StackPanel в первой строке, 2×2 Grid во второй и другую StackPanel в третьей.

Читать полностью »

13.09.2011

#384 – Преимущества Flow-Based разметки

WPF предоставляет ряд преимуществ flow-based разметки по умолчанию.

Независимость от разрешения

Это не настоящие преимущество именно flow-based разметки, но преимущество, основанное на утверждении, что указание в WPF позиций и размеров в аппаратно независимых единицах, лучше чем в пикселях. Если текущие настройки DPI совпадают с нативными DPI устройства, тогда фактический размер GUI элементов будет, как ожидалось.

Читать полностью »

12.09.2011

#383 – Проблемы с Layout основанными на координатах

WPF использует flow-based разметку по умолчанию (например, StackPanel и Grid контейнеры), с coordinate-based разметкой как опциональной возможностью (например, Canvas).

На первый взгляд coordinate-based разметка кажется проще. Вы можете установить позицию и размер каждого контрола как вам хочется на ваш взгляд. Flow-based разметка может немного разочаровать во время того как вы пытаетесь организовать дочерние элементы как вам надо.

Читать полностью »

09.09.2011

#357 – RadioButton является ContentControl

Так как контрол RadioButton является ContentControl, он может содержать единственный дочерний элемент, который может быть любым объектом .NET. Когда вы указываете значение для свойства Content в XAML, то вы указывается текстовую строку, которая используется как метка для радиокнопки. Но вы можете также установить содержимое некоторым другим контролом.

В примере ниже мы устанавливаем для каждой RadioButton содержимым StackPanel которая содержит Image и Label. Пользователь все еще может выбирать только один элемент одновременно в группе.

Читать полностью »

04.08.2011

#329 – Принципы Layout в WPF

WPF использует flow-based модель разметки по умолчанию, где каждый дочерний элемент расположен в контейнере и однозначно позиционируются на основе их контента. Это является противоположностью coordinate-based разметке, где контролы получают определенный размер и позицию.

Родительский контейнер (наследник Panel) ответственен за выяснение размера и позиции для всех своих дочерних элементов.

Читать полностью »

27.06.2011

#321 – HorizontalAlignment и VerticalAlignment

Свойства HorizontalAlignment и VerticalAlignment указывают, как дочерний контрол должен быть расположен и какой размер иметь внутри родительского контейнера.

По умолчанию контролы располагаются вертикально в StackPanel растягиваясь по горизонтали для заполнения ширины StackPanel. Контейнер StackPanel устанавливает размеры своих дочерних элементов таким способом, потому что дочернее свойство HorizontalAlignment установлено по умолчанию в значение Stretch.

Мы можем переопределить это поведение, установив HorizontalAlignment в значение Left, Center или Right. Контрол будет выровнен как показано и ширина установится в соответствии с контентом.

Читать полностью »

15.06.2011

#320 – Размер по умолчанию дочерних контролов StackPanel

По умолчанию StackPanel использует следующую логику для задания размеров дочерних элементов:

Если Orientation в значении вертикально:

  • Высота дочернего элемента устанавливается в соответствии с контентом
  • Ширина дочернего элемента растягивается до ширины StackPanel

Если Orientation в значении горизонтально:

  • Ширина дочернего элемента устанавливается в соответствии с контентом
  • Высота дочернего элемента растягивается до высоты StackPanel

В примере ниже показано как дочерние элементы располагаются вертикально.

Читать полностью »

14.06.2011

#297 – Создание зеркального изображения для контрола изображения

Вы можете перевернуть любое изображение или контрол, создавая зеркальное изображение с помощью 2D масштабирующего преобразования.

Масштабирующее преобразование представляет собой экземпляр класса ScaleTransform. Вы можете масштабировать виртуальное представление любого изображения или контрола по оси X или Y (или обоим сразу).

Свойства ScaleX и ScaleY класс ScaleTransform представляют собой коэффициенты в заданном измерении. По умолчанию значения положительные, но вы можете использовать значения меньше нуля для указания того что объект поворачивается в заданном измерении.

В примере ниже мы уменьшаем изображение на половину его оригинального размера и переворачиваем в X измерении.

Читать полностью »

11.05.2011

#284 – Делаем Image прозрачным используя свойство Opacity

Так как контрол Image наследуется (напрямую) от UIElement, то он имеет свойство Opacity. Свойство Opacity позволяет контенту за изображением быть видимым через изображение. Значение свойства лежит в диапазоне от 0.0 до 1.0, 0.0 означает, что изображение полностью прозрачно (не отображается вообще) и 1.0 означает, что изображение полностью не прозрачно (ничего сквозь него невидно).

В примере ниже мы привязываем значение свойства Slider'а к свойству Opacity у контрола Image, так что мы можем легко менять прозрачность. Мы так же заполнили фон окна градиентной заливкой.

Когда Opacity равно 1.0, то изображение полностью непрозрачно и градиент не виден сквозь изображение.

Читать полностью »

22.04.2011

#277 – У изображений есть встроенная информация по DpiX и DpiY

Зачастую когда вы задаете Stretch=None для контрола Image, вы можете получить сообщение, что изображение не может быть отображено в ожидаемом размере в пикселях для высоты/ширины. Это случается когда разрешение изображения (DPI) не совпадает с системным DPI.

В файле изображений (таких как .png или .jpg) содержится информация в пикселях о ширине/высоте. Файл изображения может также содержать информацию о DpiX и DpiY (разрешение). Эта информация о разрешении присутствует не во всех файлах.

Читать полностью »

15.04.2011

#251 Встраивание UIElement внутри FlowDocument

Вы можете встроить любые UIElement в FlowDocument используя тип блока BlockUIContainer. Это позволяет вставлять контролы в середину документа. Зная, что Panel наследуются от UIElement вы можете вставить не только одиночный элемент, но и контейнер который может содержать другие контролы.

Далее пример:

Читать полностью »

20.03.2011

№193 – Вы можете иметь одновременно открым проект в Blend и Visual Studio

Visual Studio лучше для некоторых вещей, чем Blend (например, написание кода). Blend лучше, чем Visual Studio для других вещей (например, изменение разметки).

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

Читать полностью »

21.01.2011

#186 – Когда надо использовать Blend (а не Visual Studio)

Вы можете разрабатывать приложение, используя только Visual Studio. Так же вы можете разрабатывать приложение без Visual Studio, используя любой редактор на ваш выбор и командную строку для создания приложения.

Но в идеале вы хотите использовать оба инструмента Visual Studio и Blend. Есть много веще которые вы можете делать и там и там, но есть базовая модель:

Читать полностью »

14.01.2011

#180 – Как работают Layout

Размещение в WPF зависит от контейнера (такие как Grid, StackPanel) в котором размещаются дочерние элементы (такие как Button, Label). Контейнер задает конечный размер и позицию для каждого дочернего элемента, что определяет, как дочерние элементы отобразятся.

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

Читать полностью »

08.01.2011

#179 Контролы панели, которые могут содержать потомков типа UIElement

Элементы, которые действуют как контейнеры называются панелями, они наследуются от Panel. Панель может содержать один или несколько дочерних элементов, каждый является наследником UIElement.

Несколько примеров классов наследников Panel:

Читать полностью »

07.01.2011

#171 – Базовые классы – Freezable и Animatable

Мы можем добавить два других важных класса в нашу иерархию классов - Freezable и Animatable.

  • Freezable - Реализует паттерн "freezable" в котором объект может предоставлять "замороженную" копию самого себя в режиме только для чтения.
  • Animatable – Наследуется от Freezable и добавляет возможность анимации свойств

Оригинал: #171 – Other Base Classes – Freezable and Animatable

30.12.2010

#155 – Реализация Attached Dependency Property

Когда вы реализуете dependency property, которое будет использовано как присоединяемое свойство XAML, вы используете метод DependencyProperty.RegisterAttached, а не метод DependencyProperty.Register. Описание определения метода RegisterAttached аналогично Register, включая все параметры.

В примере ниже, когда мы регистрируем Person.AgeProperty, которое мы хотим использовать как присоединяемое свойство XAML.

Читать полностью »

14.12.2010

#154 – Переиспользование существующего Dependency Property в вашем классе

Как мы рассмотрели ранее как зарегистрировать новое dependency property в своем классе используя метод DependencyProperty.Register. Вы также можете переиспользовать существующее dependency property, используя метод DependencyProperty.AddOwner.

Когда вы переиспользуете существующее dependency property, вы можете опционально указать новые метаданные, которые будут применены для использования к dependency property в вашем новом типе. Вы также должны определить свойства CLR для нового типа, которые будут оборачивать вызовы GetValue/SetValue для чтения/записи значений dependency property.

Читать полностью »

13.12.2010

№146 – Использование метода GetValueSource для поиска источника значения Dependency Property

Зачастую полезно определить источник текущего значения dependency property. Вы можете использовать метод DependencyPropertyHelper.GetValueSource для этого.

В следующем примере получение значение источника свойства Foreground возможно из стиля или триггера определенного стилем определенного на основе значения свойства IsEnabled.

Читать полностью »

05.12.2010

№145 – Dependency Property Value Sources: №11 – значение по умолчанию

Одиннадцатый источник из списка источников базового значения для dependency property является значение по умолчанию. Dependency property может определять значение по умолчанию, которое устанавливает значение свойства, если не нашлось механизма с большим приоритетом для установки значения.

Например, обратите внимание, что значение свойства Opacity для большинства контролов унаследованных от UIElement (например, Button или Label) имеет значение 1.0, если вы не измените его на что-нибудь еще. Это значение по умолчанию для свойства UIElement.Opacity, указанное в его метаданных.

Читать полностью »

04.12.2010

№144 – Dependency Property Value Sources: №10 – наследование

Десятый источник в списке источников базового значения dependency property является наследование. Свойство может получить свое базовое значение через наследование, если вышестоящий элемент в логическом дереве устанавливает свойство и свойство не переопределено согласно более высокому приоритету.

Это значит, что когда вы устанавливаете значение свойства в XAML или в коде, то это значение зачастую "стекает вниз" по элементам дерева и применяется к другим элементам, которые имеют свойство с тем же именем.

Вот пример, где значение FontStyle для нескольких контролов наследуется от вышестоящего элемента Window.

Читать полностью »

02.12.2010

№143 – Dependency Property Value Sources: №9 – стиль темы

Девятый источник в списке источников базового значения dependency property является стиль определенный в теме. Свойство получает базовое значение из стиля темы, если сеттер для контрола определен в стиле по умолчанию. Каждый контрол поставляемый с WPF имеет стиль по умолчанию, который определяет внешний вид, который известен как стиль темы.

Если мы взглянем на стиль по умолчанию для контрола, мы увидим что стиль по умолчанию устанавливает свойство Background для ComboBox:

Читать полностью »

02.12.2010

№142 – Dependency Property Value Sources: №8 – триггер стиля темы

Восьмой источник в списке источников базового значения dependency property является триггер определенный в стиле темы. Триггером стиля темы является триггер определенный в стиле по умолчанию для контрола. Каждый контрол, который поставляется с WPF имеет стиль по умолчанию который определяет внешний вид, также известный как стиль темы.

В примере обратите внимание, что когда вы устанавливаете свойство IsEditable для ComboBox в true, то внешний вид меняется.

Читать полностью »

01.12.2010

№141 – Dependency Property Value Sources: №7 – сеттеры стилей

Седьмой источник в списке источников базового значения dependency property является сеттер стиля. Свойство получает свое значение из сеттера стиля, когда стиль применяется к родительскому элементу и значение свойства устанавливается с помощью использования Setter из применяемого стиля.

В примере ниже, кнопка имеет стиль redBlueTextButton. Стиль устанавливает свойство Foreground в красный цвет, используя Setter. Так же устанавливается синий цвет, когда вы проводите мышкой над контролом. Источником свойства Foreground является стиль (style setter) после применения и при срабатывании триггера стиля, когда мышка над контролом.

Читать полностью »

30.11.2010

№140 – Dependency Property Value Sources: №6 – триггеры шаблона

Шестой источник в списке источников базового значения dependency property является триггер из шаблона. Свойство получает свое значение из триггера шаблона, когда элемент, которому принадлежит свойство имеет шаблон с триггером, который изменяет значение.

В примере ниже, мы применили шаблон к главной кнопке, заменив ее двумя метками и новой кнопкой. триггер изменяет свойство Foreground оригинальной кнопки, таким образом источник свойства получает значение из триггера определенного в шаблоне.

Оригинальная кнопка замещается контролами из шаблона, но свойство Foreground сохранено используя расширение разметки TemplateBinding.

Читать полностью »

29.11.2010

№139 – Dependency Property Value Sources: №5 – триггеры стилей

Пятый источник в списке источников базового значения dependency property является триггер стиля. Свойство получает значение и стилевого триггера, когда стиль применяется к родительскому элементу и значение свойства меняется в результате срабатывания триггера.

В примере ниже, к кнопке применен стиль blueTextButton. Стиль устанавливает свойство Foreground синим цветом, когда курсор мыши находится над контролом. Источник свойства Foreground получает свое значение во время срабатывание триггера.

Читать полностью »

28.11.2010

№138 – Dependency Property Value Sources: №4 – неявный стиль

Четвертый источник в списке источников базового значения dependency property является неявный стиль. Это правило применяется только к dependency свойству Style.

Свойство Style пролучает значение неявно, когда стиль применяется ко всем элементам, чей тип совпадает с указанным целевым типом (TargetType) стиля.

Так как явный стиль рассматривается как локальное значение, то получается следующий список приоритетов для свойства Style от высшего к низшему:

Читать полностью »

27.11.2010

№137 – Значение свойства Style получается из одного из трех мест

Свойство Style одно из dependency property, которое не следует полному списку правил приоритетов значения свойств. Его значение может быть получено из одного из трех источников приведенных ниже.

  1. Explicit style - Стиль явно указан в XAML, как ресурс или указан в коде. Работает как локальное значение
  2. Implicit style - Стиль применяется ко всем элементам, чьи типы совпадают с целевым типом стиля
  3. Default - Нет указанного стиля, используется стиль по умолчанию

Вот пример explicit style.

Читать полностью »

26.11.2010

№136 – Dependency Property Value Sources: №3 – родительский шаблон

Третий источник в списке источников базового значения dependency property является родительский шаблон. Свойство получает свое значение из родительского шаблона, если элемент для которого устанавливается свойство создан как часть шаблона и не получил свое значение из триггера.

В примере ниже, шаблон excitedLabel имеет два контрола потомка Label. Один из них имеет свойство Background установленное из шаблона, таким образом источником является родительский шаблон.

Читать полностью »

25.11.2010

№135 – Dependency Property Value Sources: №2 – триггер в родительском шаблоне

Второй источник в списке источников базового значения dependency property это триггер в родительском шаблоне. Свойство получает значение из триггера родительского шаблона, если элемент часть шаблона и его значение устанавливается триггером, определенным в шаблоне.

В примере ниже, шаблон excitedLabel имеет два контрола потомка Label, чье свойство Background изменяется, когда вы проводите мышкой над родительским контролом. Когда это случается, то источник их свойства Background устанавливается триггером родительского шаблона.

Читать полностью »

24.11.2010

№134 – Dependency Property Value Sources: №1 – локальное значение

Наивысший приоритет источника для базового значения dependency property является локальное значение, установленное в XAML для элемента владельца свойства, или установленное из кода. Если локальное значение установлено, то оно заменит все остальные возможные источники базового значения для свойства.

В следующем примере, 2-й контрол Label предоставляет локальное значение для свойства FontStyle, перекрывая унаследованное значение.

Читать полностью »

23.11.2010

№133 – Где Dependency Property берет свое значение

Так как значение dependency property могут быть получено из различных источников, WPF использует заданный приоритет для каждого возможного источника значения свойства в целях определения окончательного значения.

WPF определяет конечное значение для dependency property следующим образом:

  • Определение базового значения, используя правила приоритета, перечисленных ниже
  • Вычисление выражения
  • Применение анимаций
  • Coerce значенеи (реализация класса может принудительно изменить валидное значение)
  • Валидация (реализация класса может выбросить исключение, если значение не валидное)

Читать полностью »

22.11.2010

№131 – Dependency Properties наследуют значения от вышестоящих в логическом дереве

Значение dependency property может быть получено из различных источников, но зачастую свойство наследуется от элемента расположенного выше в логическом дереве.

Имеется ввиду, что когда вы устанавливаете значение свойства в XAML или коде, то значенеи зачастую "стекает" по дереву элементов и применяется к другим элементам, которые имеют свойство с темже именем.

Вот пример. Значение FontStyle для нескольких контролов наследуется от вышестоящего элемента Window.

Читать полностью »

20.11.2010

№126 – Реагирование на изменение Dependency Property используя биндинг

Один из вариантов отреагировать на изменение значения в dependency property это привязка свойства одного контрола к свойству другого.

Идея связи в том, что исходный объект и свойство, откуда получаются данные и объект назначения со свойством куда данные привязываются друг к другу.

Это пример, в котором мы привязываем контент контрола Label к значению Slider.

Читать полностью »

15.11.2010

№123 – Coercing a Dependency Property

Класс который реализует зависимое свойство (dependency property), может также предоставлять метод обратного вызова для coercion, которое указывается при регистрации свойства. Coercion callback вызывается перед получением свойством нового значения и дает классу возможность принудительно изменить значение свойства на другое значение.

Вы укажите метод обратного вызова валидации при регистрации зависимого свойства, используя делегат CoerceValueCallback.

Читать полностью »

12.11.2010

№122 – Валидация Dependency Property

Класс, который реализует зависимые свойства (dependency property), может также предоставлять обратные вызовы для валидации (validation callback), которые указываются при регистрации свойства. Обратные вызовы валидации вызываются, когда свойство устанавливается в новое значение и возвращает true или false, указывая валидно ли новое значение.

Вы указываете обратный вызов валидации при регистрации зависимого свойства.

Читать полностью »

11.11.2010

#117 – Регистрация Dependency Property

Для реализации dependency property, класс должен создать одиночный статический экземпляра класса DependencyProperty. Этот экземпляр статический потому, что DependencyProperty только описывает dependency property, а не является местом для хранения фактического значения свойства.

Начните с определения статического поля для нового свойства.

Читать полностью »

06.11.2010

#115 – Скачивание всего исходного кода .NET 4

В статье №90 показано, как пошагово отлаживать исходный код .NET 4 из Visual Studio 2010. Если вы хотите просто посмотреть исходный код без пошаговой отладки в отладчике, то вы можете скачать его весь себе.

Зайдите на сайт: http://referencesource.microsoft.com/netframework.aspx.

Вы увидите список всех компонентов с исходным кодом, которые можно скачать. Посмотрите ближе к концу списка на .NET 4.

Читать полностью »

04.11.2010

#33 – Класс Control

Класс Control наследует от FrameworkElement и является базовым классом для всех элементов управления, с которыми пользователь взаимодействует. Примеры элементов управления включают: TextBox, Label, ListBox, ComboBox и Button. Контейнер элементов, таких как Panel и Grid не являются элементами управления.

Класс Control расширяет FrameworkElement путем добавления функциональности:

  • Изменение внешнего вида элемента управления с помощью шаблонов
  • Поддержка визуальных элементов, таких как шрифты, границы и цвет фона

Оригинал: #33 – Control Class

14.08.2010

#32 – Класс FrameworkElement

FrameworkElement класс наследуется от UIElement и, в свою очередь родительский класс для всех элементов управления в WPF.

FrameworkElement основывается на UIElement и добавляет следующую функциональность:

  • Layout – реализует макет модели путем реализации свойства, таких как HorizontalAlignment, MinWidth и Margin
  • Поддержка анимации с помощью метода BeginStoryboard
  • Привязка данных
  • Шаблоны данных для привязки данных
  • Стили

FrameworkElement является также основным базовым классом для объектов, которые будут добавлены к логическому дереву (иерархия визуальных объектов, которые составляют пользовательский интерфейс).

Оригинал: #32 – FrameworkElement

13.08.2010

#31 – Класс UIElement

UIElement класс наследует от класса Visual и добавляет поддержку для основного поведения взаимодействия с пользователем, в том числе:

  • Layout behavior
    • Родительские/дочерние отношения
    • Measure/Arrange passes
  • Взаимодействие с пользовательским вводом
    • Входные события из устройств, таких как клавиатура/мышь
    • Команда привязок
  • Управление фокусом
  • Возбуждение (и ответ на) маршрутизируемых событий
    • Продвижение события по дереву элемента

Обратите внимание, что аббревиатура образована, чтобы помочь в понятии UIElement - "Жизнь начинается в UIElement".

Оригинал: #31 – UIElement Class

12.08.2010

#30 – Класс Visual

Visual является базовым классом для всех классов, которые представляют собой объекты, которые могут быть отображены в окне WPF или страниц. Он обеспечивает поддержку для проверки нажатия, вырезки и преобразования координат, а также для визуализации себя в окне или странице. Он также моделирует участие объекта в визуальном дереве WPF, через свойство VisualParent и метод GetVisualChild.

Класс Visual также может быть использован как отправная точка для внедрения новых (облегченных) элементов управления WPF.

Оригинал: #30 – Visual Class

11.08.2010

#29 – Зависимые свойства

DispatcherObject является базовым классом для классов, которые поддерживают свойства зависимостей.

Свойство зависимостей в WPF похоже на стандартное свойство CLR, но более мощное. Зависимость свойств:

  • Получить их значения от одного из нескольких различных источников
  • Поддержка наследования значений свойств
  • Поддержка уведомлений, при изменении значения свойства

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

Оригинал: #29 – Dependency Properties

10.08.2010

#28 – DispatcherObject

Класс DispatcherObject представляет собой объект, связанный с Dispatcher. Диспетчер управляет очередью запросов на выполнение работ на конкретном потоке. Он обладает возможностью вызывать методы связанные с потоком.

Читать полностью »

09.08.2010

#27 – Иерархия классов

При работе с различными классами и элементами управления в WPF, будет полезно знать отношения родитель-потомок между классами. .NET Framework использует сложный интерфейс наследования, это означает, что многие свойства и методы элементов управления или класса производного от другого класса выше в иерархии.

Вот представление иерархии классов для подмножества из наиболее распространенных классов в WPF. (Нажмите на изображение, чтобы увидеть полный размер).

Читать полностью »

08.08.2010

#25 – Обзор механизма привязки данных

Привязка данных является одной из основных функций в WPF. В типичном приложении, есть уровень представления, который содержит визуальные элементы управления, позволяющие пользователю взаимодействовать с приложением и его данные. Ниже уровня представления, как правило, бизнес уровень, который содержит CLR объекты, которые содержат фактические данные. (Там также может быть более низкий уровень данных, где данные сохраняются, например, базы данных).

Читать полностью »

06.08.2010

#24 – Не используйте растровые изображения в приложениях WPF

Так как в WPF есть возможность масштабирования приложения на основе системы DPI, следует избегать использования растровых изображений в приложение. Вместо этого, вы должны визуализировать все элементы управления, например, Кнопки на панели инструментов, в векторной графике, так чтобы они могли быть расширены больше/меньше и все еще выглядеть правильно.

Читать полностью »

05.08.2010

#23 – Единицы измерения WPF (WPF Units)

В Windows Forms, размеры контролов задаются с помощью пикселей. В WPF, размеры задаются с помощью WPF единиц (WPF Units).

1 WPF единица = 1/96 дюйма. Это означает, что при 96 точек на дюйм (типичные), 1 WPF единица = 1 пиксель.

Читать полностью »

04.08.2010

#22 – Контролы компоновки

В WPF, основная модель для контролов компоновки основана на поточной, а не координатной основе. Дочерние элементы управления добавляются в контейнер компоновки, который управляет расположением и размерами дочерних элементов управления в зависимости от размера и формы контейнера.

Вот главные контролы компоновки, включенные в WPF:

Читать полностью »

03.08.2010

#21 – WPF Control Sampler

В WPF контрол является визуальным компонентом, который можно разместить в окне или на странице.

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

Читать полностью »

02.08.2010

#20 – Автономные и приложения, размещенные в браузере

Вы можете использовать WPF для создания как автономных приложений, работающих на Windows, так и приложений, которые запускаются в окне браузера. Также известные как XBAPs (XAML Browser Applications).

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

XBAPs может быть запущен в любом броузере Internet Explorer или Firefox. Они работают с правами частичного доверия в изолированной среде.

Оригинал: #20 – Standalone and Browser-Hosted Applications

01.08.2010

#19 – Пространство имен System.Windows

Большинство связанных с пользовательским интерфейсом классов, для использования в приложении WPF расположены в пространстве имен System.Windows или в одним из вложенных.

Некоторые из классов, присутствующих в System.Windows:

Читать полностью »

31.07.2010

#18 – Разница между Silverlight и WPF

Оригинальное название Silverlight было WPF/E (WPF/Everywhere), что подчеркивает тот факт, что Silverlight следует той же модели программирования, как WPF и использует многие из тех же элементов управления, но основан на клиентской библиотеке, которая загружается через браузер с целью работы на множестве платформ.

Основные различия между WPF и Silverlight:

Читать полностью »

30.07.2010

#17 – История релизов WPF

Вот история различных версий WPF, вместе с соответствующей версией Visual Studio, которые поддерживали его. WPF является составной частью .NET Framework, она имеет номер на основе .NET Framework релизов. (Например, WPF 3.5 относится к WPF-релиз .NET Framework 3.5).

Читать полностью »

29.07.2010

#16 – Использование Direct3D для хардкорных 3D-приложений

Несмотря на то, WPF поддерживает рисование 3D-объектов, Direct3D по-прежнему следует использовать там, где необходимо применение 3D-функций, не предусмотренных в WPF или где необходима максимальная производительность в прорисовке 3D-объектов.

WPF 4.0 основана на DirectX 9 и поэтому не поддерживает Direct3D 10 или Direct3D 11.

Подсказка:

WPF приложение может содержать Windows Form контрол, который может быть написан с использованием D3D10+ и поддерживает стандартные вызовы D3D, что и позволит разместить его на WPF.

Оригинал: #16 – Use Direct3D For Hard-Core 3D Applications

28.07.2010

#15 – WPF против Silverlight и ASP.NET

WPF, Silverlight и ASP.NET являются тремя основными платформами разработки приложений Microsoft.

  • WPF
    • Для разработки приложений для Windows
    • Толстые пользовательский интерфейс клиента, с самым богатым набором пользовательских элементов управления и Windows-особенности
    • Платформы - работает только на Windows, или из браузера
    • Требуется полная установка .NET Framework на клиентах
  • Silverlight
    • Для разработки веб-приложений, которые можно запустить из браузера
    • Тонкий клиент с богатым набором элементов управления пользовательского интерфейса, которые ближе к традиционным элементам управления
    • Платформы
      • Работает как плагин для браузера, в большинстве браузеров
      • Silverlight работает на Windows, Mac OS X, Windows Phone 7
      • Moonlight версия Silverlight позволяет запускать на Linux
    • Требуется установленный Silverlight на клиентах
  • ASP.NET
    • Для разработки веб-приложений
    • Тонкий клиент, на основе общимих стандартных веб-контролах
    • Платформы - запускается на сервере, так что на клиент доставляется как стандартная разметка HTML на любой платформе, в том числе браузерах на мобильных устройствах
    • Не требуется ничего устанавливать на клиенте

Оригинал: #15 – WPF vs. Silverlight and ASP.NET

27.07.2010

#14 – Постраничная навигация

WPF приложения могут быть структурирован как набор страниц, со встроенной навигацией между страницами. Это отличает их от более традиционных (Win Forms) моделей основанных на документе, в которых приложение выводит на экран главное окно и всплывающие над ним диалоги.

Читать полностью »

26.07.2010

#13 – Преимущества разметки

Использование разметки + кода для разработки приложений имеет ряд преимуществ, в отличие от определения всего только в коде.

Преимущества использования разметки/XAML:

  1. Можно изменить внешний вид и представление приложения без изменения поведения
    1. Можно изменить внешний вид/представление, изменяя XAML
  2. Дизайнеры могут работать над внешним видом (XAML), в то же время, что разработчики работают над поведением (код)
  3. Простота для инструментов дизайна для визуализации приложений
    1. Инструмент может просто интерпретировать XAML, вместо того, чтобы выполнить код, который создает элементы управления
    2. Это значит, что инструменты, кроме Visual Studio, (например, Blend) могут быть использованы для работы только над пользовательским интерфейсом
  4. XAML может быть создан программно инструментами проектирования
Оригинал: #13 – Benefits of Markup

25.07.2010

#12 – Разметка и код

WPF приложений состоит из разметки (XAML) и кода (управляемый код). Разметка определяет расположение и внешний вид приложения, в то время код определяет поведение.

Читать полностью »

24.07.2010

#11 – Команды

WPF предоставляет поддержку для команд (commands), где команда это объект, который выполняет определенную задачу независимо от графического элемента, который инициировал эту задачу. Основной целью команды является перемещение кода, общего для нескольких элементов управления в одно место, из обработчиков событий для отдельных элементов управления. Это позволяет нескольким элементам управления вызвать один и тот же код с логикой команды.

Читать полностью »

23.07.2010

#10 - Шаблоны

Как и стили в WPF, но разные, как шаблоны (templates). Шаблоны позволяют заменить все аспекты внешнего вида элемента управления пользовательского интерфейса без изменения его поведения.

Читать полностью »

22.07.2010

#9 – Стили

В WPF стиль представляет собой набор значений свойств, которые вы можете переиспользовать при создании аналогичных свойств у нескольких элементов управления. Вы можете сохранить стиль как ресурс, а затем применить этот ресурс для нескольких элементов управления, устанавливая их свойство стиля Style.

Читать полностью »

21.07.2010

#8 – Аудио и видео

WPF позволяет очень легко сделать поддержку для воспроизведения аудио или видео в вашем приложении. Вы можете проигрывать любой медиа тип, поддерживаемый Windows Media Player, в том числе аудио форматов, таких как WAV и MP3 или видео форматы, такие как AVI, WMV и MPG.

Читать полностью »

20.07.2010

#7 – Анимация на основе свойств

Анимация является одной из основных особенностей WPF. В отличие от более старых framework'ов, таких как Windows Forms, вам не нужно реализовывать анимацию с использованием таймеров и визуализировать анимацию покадрово. Вместо этого, WPF использует анимацию на основе свойств (property-based animation), где вы анимируете графические элементы путем описывания, как свойства должны измениться с течением времени.

Читать полностью »

19.07.2010

#6 – WPF Layout

WPF использует потоковую модель расположения (flow-based layout) для позиционирования элементов управления, а не на основе координатой модели, в которой местоположение каждого элемента управления задается с помощью точных координат пикселей. Это расположение модели, подобно тому, как на веб-страницах задается расположение с помощью CSS.

Читать полностью »

18.07.2010

#5 – Векторная графика и независимость от разрешения

В WPF, визуализация происходит с использованием векторной графики, а не растровыми изображениями. Это относится как встроенные элементы управления, так и к пользовательским элементам управления, которые вы создаете.

Читать полностью »

17.07.2010

#4 – WPF как замена Windows Forms

Windows Presentation Foundation (WPF) является заменой для Microsoft Windows Forms, в качестве платформы для разработки клиентских приложений для Windows. Windows Forms будет по-прежнему поддерживаться, но WPF является будущим для разработки клиентских приложений Windows.

WPF предоставляет множество преимуществ по сравнению с Windows Forms. Visual Studio 2010 представляет отличные инструменты для разработки WPF приложений.

Оригинал: #4 WPF replaces Windows Forms

16.07.2010

#3 – Инструменты для разработки WPF приложений

Единственный инструмент, который вам понадобится для разработки WPF (версия 4) приложений это Visual Studio 2010. Вы можете скачать Visual Studio 2010 Express бесплатно с сайта Microsoft. (Для каждого языка разработки представлена своя версия).

Для разработки приложений на других языках и на других платформах (например, 64-разрядный), или для того чтобы воспользоваться другими дополнительными функциями, вы должны воспользоваться платной версией Visual Studio 2010.

Чтобы получить более расширенную функциональность при разработке пользовательских интерфейсов, воспользуйтесь 4 Expression Blend.

Оригинал: #3 Tools for developing WPF applications

15.07.2010

#2 – Слои визуализации

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

  1. Уровень 0 - Нет аппаратного ускорения, все рендеринг выполняется с помощью программного обеспечения
  2. Уровень 1 - Некоторые аппаратное ускорение доступно. DirectX версии> = 9,0. Аппаратное ускорение для:
    1. Радиальные градиенты
    2. 3D расчеты освещения
    3. Рендеринг текста
    4. 3D сглаживание
  3. Уровень 2 - Большинство функций использовать аппаратное ускорение. DirectX версии> = 9,0

Для определения текущего уровня визуализации можно использовать следующий код:

int renTier = (RenderCapability.Tier >> 16);
MessageBox.Show(string.Format("Уровень = {0}", renTier));

Оригинал: #2 Rendering Tiers

14.07.2010

#1 – Что такое WPF?

WPF (Windows Presentation Foundation) является .NET библиотекой классов, которая позволяет создавать графически насыщенные клиентские программы для Windows. WPF приложения могут быть запущены либо в виде отдельных программ или могут работать внутри веб-браузера (Silverlight).

WPF визуализирует графические элементы с использованием векторной 3D графики, независимо от разрешения экрана. WPF использует DirectX для визуализации графических элементов, что позволяет воспользоваться преимуществами аппаратного ускорения. Если аппаратное ускорение недоступно, WPF визуализирует элементы программно, а не аппаратно.

WPF заменяет Windows Forms в качестве среды программирования для создания клиентских приложений на Windows.

Оригинал: #1 What is WPF

13.07.2010

WPF навигация

В 2001 Microsoft опубликовала документ под названием Inductive User Interface Guidelines. Если вы еще не читали этот документ, то я советую сделать это. В этой статье я хочу рассмотреть построение вводного пользовательского интерфейса на WPF.

Читать полностью »

02.10.2009

Действительно ли WPF независима от разрешения?

Один из главных заявленных преимуществ WPF это "независимость от разрешения". Зачастую это заявление описывается относительно расплывчато ведущими людьми, чтобы поверить что это значит тоже самое что WPF окно будет отображаться на любом мониторе в одинаковом размере независимо от разрешения которое установлено.

Читать полностью »

16.06.2007

Конвертация векторного формата SVG в разметку WPF XAML

Я хочу написать приложение на WPF, которое требует карту мира, и хотел использовать векторное изображение, чтобы при изменении размера все оставалось красиво. Я нашел эту SVG [1] карту мира, и использовал SVG Xamlon to Xaml конвертер для преобразования его в Xaml. После удаления одного паразитного пространства имен, я смог загрузить его в XamlPad. Полученные результаты представлены ниже (SVG версия отображается в программе для рисования векторной графики Inkscape).

Читать полностью »

21.11.2005