Пользовательские шаблоны элементов управления, отображение и WPF

Я родом из Windows Forms, и я немного смущен тем, что считается лучшей практикой для управления отображением элемента управления. Я работаю над элементом управления, на котором хочу немного «конфетки для глаз». В WinForms я бы переопределил событие Paint, чтобы выполнить любое визуальное программирование. Я понимаю, что основная причина, по которой был задуман WPF, заключается в том, чтобы отделить действие от отображения.

Вот та часть, в которой я не уверен. Скажем, я хочу нарисовать несколько простых линий на «фоне» элемента управления. Будет ли лучшей практикой добавлять строки в шаблон или выполнять отрисовку линий в программном коде, как я сделал бы в WinForms?

Например, скажем, я разрабатываю элемент управления с именем CustomControl1 и хочу нарисовать линию по всей ширине элемента управления, центрированную по вертикали, например:

ПользовательскийКонтроль1

Лучше сделать строку в Code Behind или в шаблоне?

Я могу сделать это полностью в xaml следующим образом:

<Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Padding="{TemplateBinding Padding}"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">

                        <Grid HorizontalAlignment="Left" Width="{Binding ActualWidth}">

                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Aqua">
                                <Path Stretch="Fill" Stroke="Black" StrokeThickness="1" Data="M 0,0.5 H 1" />
                            </Border>

                            <TextBlock 
                                    HorizontalAlignment="Center"
                                    Text="Some Text" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Я не уверен, что это «лучшая практика» или есть другой способ, который я должен использовать все вместе? Есть ли одна причина использовать один над другим? Есть ли прирост/потеря производительности?


person Andy Braham    schedule 20.02.2017    source источник
comment
Визуальная структура элемента управления WPF обычно определяется его свойством Template, которое установлено в Style (по умолчанию). См., например. разделы Примечания и Примеры в ControlTemplate на странице MSDN. Раздел Шаблоны элементов управления на сайте Стили и шаблоны также могут быть полезны.   -  person Clemens    schedule 21.02.2017


Ответы (2)


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

person Thierry Jutras    schedule 20.02.2017

ИМО, ваш код в порядке. Никто никогда не будет делать «рисование линий в программном коде, как я сделал бы в WinForms» для таких требований в WPF.

Управление отображением элемента управления с помощью ControlTemplate и Style является лучшим и рекомендуемым подходом в WPF. Кроме того, если вам нужны элементы управления в коде, вы можете получить элементы управления, определенные в ControlTemplate, используя метод GetTemplateChild внутри переопределения OnApplyTemplate вашего пользовательского элемента управления.

person WPFUser    schedule 21.02.2017