Куда нужно поместить XAML для компоновки пользовательского элемента управления в WPF?

После создания пользовательского элемента управления автоматически появился файл для C#-кода MyCustomControl.cs:

public class MyCustomControl : ContentControl {
    static MyCustomControl( ) {
        ...
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl),
        new FrameworkPropertyMetadata(typeof(MyCustomControl)));
      }
        ...
 } 

и файл стиля по умолчанию - Themes\Generic.xaml:

 <!-- themes/generic.xaml -->
 <ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:local="clr-namespace:CustomControlLib">
   <Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template">
     <Setter.Value>
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
       <Border Background="{TemplateBinding Background}"
               BorderBrush="{TemplateBinding BorderBrush}"
               BorderThickness="{TemplateBinding BorderThickness}">
         <ContentPresenter />
       </Border>
      </ControlTemplate>
     </Setter.Value>
    </Setter>
   </Style>
 </ResourceDictionary>

Но где и как мне правильно разместить код XAML для макета и содержимого самого пользовательского элемента управления?


person rem    schedule 05.12.2009    source источник


Ответы (1)


Макет (по умолчанию) и содержимое пользовательского элемента управления определяются шаблоном ControlTemplate в generic.xaml. Таким образом, вы должны поместить макет и содержимое в созданный для вас элемент ControlTemplate. (Обратите внимание, что ContentPresenter будет отображать контент, предоставленный пользователями вашего элемента управления: вам нужно только предоставить «контент», который является частью вашего шаблона, например, в поле флажка ваш шаблон будет содержать маленький квадрат, но пользовательский контент будет содержать заголовок .)

person itowlson    schedule 05.12.2009
comment
Да, я пытаюсь это сделать, но в этом случае получаю сообщение об ошибке: Свойство «Визуальное дерево» задано более одного раза (если я поместил элемент рядом с элементом «Граница») или свойство «Дочерний элемент» задано более одного раза (если я поместил более двух элементов внутри элемента границы). Что я делаю неправильно? - person rem; 05.12.2009
comment
Кажется, я понимаю: мне просто нужно добавить элемент-обертку, что-то вроде StackPanel или подобного. Спасибо! - person rem; 05.12.2009