воскресенье, 17 октября 2010 г.

Шаблоны в WPF 4. Часть 2. ContentPresenter

Если вы собираете новый элемент управления из компонентов на свой выбор, как вы обрабатываете внутренние составляющие элемента управления? Например, если вы разрабатываете шаблон для элемента управления Label, делаете отображение текста внутри Border со скошенной кромкой и как вы узнаете что текст отобразился?

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

Например, следующий код показывает максимально простой шаблон Label:

<Window.Resources>
     <ControlTemplate x:Key="temSimpleLabel" TargetType="Label">
         <Border BorderBrush="Red" BorderThickness="1">
               <ContentPresenter/>
         </Border>
     </ControlTemplate>
</Window.Resources>

Имя шаблона – temSimpleLabel, и он применим к элементам управления Label. Шаблон содержит элемент управления Border, который отображает красную границу и содержит ContentPresenter.

Следующий код показывает как программа может использовать этот шаблон. Этот код создает Label. Его набор аттрибутов в конце устанавливает свойство Template (устанавливается ранее созданный шаблон).

<Label Margin="5" Content="No Template"
            HorizontalContentAlignment="Right"
            VerticalContentAlignment="Center"
            BorderBrush="Yellow" BorderThickness="2"
            Foreground="{StaticResource brForeground}"
            Background="{StaticResource brBackground}"
            Template="{StaticResource temBorderLabel}"
/>

Пример программы показан на рисунке 2, отображающем два элемента Label. Один из них слева не использует шаблон, в то время как другой справа использует шаблон temSimpleLabel.

image

рис. 2

Об этом и гораздо больше можно прочитать в книге: WPF Programmers Reference with C# 2010 and .NET 4 (EN).

Комментариев нет:

Отправить комментарий