#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

Управление ресурсами с помощью Reactive Extensions

Несмотря на то, что Reactive Extensions очищают после себя, вы все равно должны управлять ограниченными ресурсами и освобождать любые неуправляемые ресурсы.

Как вариант вы можете использовать выражение с Observables.

Чтобы это сделать, вызовите параметризованный статический метод Using у Observable. Он возвращает IObservable<char> и принимает два параметра. Первый параметр является функцией (Func), которая возвращает streamReader, а второй является функцией (Func), которая принимает StreamReader сделанный в первом и возвращает IObservable из типа char.

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

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

26.05.2011

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

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

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

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

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

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

11.05.2011