2014-11-07 3 views
0

В winforms было 2 шаблона: UserControl позволяет создавать составные элементы управления (группу существующих элементов управления) для повторного использования и стандартизации операций с ним, CustomControl был полностью настраиваемым элементом управления (часто визуализируется вручную, выполняется иначе, чем стандартные элементы управления и т. д.), что позволяет переопределять и обеспечивает доступ к protected вещам.Как сделать пользовательский контроль в WPF

В wpf я нашел только шаблон UserControl (используя экспресс-версию VS).

Для создания пользовательских MyControl я делаю следующее:

  • создать нормальный класс, основанный на Control/ContentControl;
  • создать словарь ресурсов с Style, содержащим шаблоном управления (может быть только ControlTemplate, стиль лучше, потому что может содержать другие свойства сеттера)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:MySolution"> 
    <Style x:Key="MyControl" TargetType="local:MyControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:MyControl"> 
        <Grid x:Name="PART_Grid"> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
  • связывает их вместе таких как

public class MyControl : Control 
{ 
    public MyControl() 
    { 
     var dictionary = new ResourceDictionary(); 
     dictionary.Source = new Uri("/MySolution;component/MyControl.xaml", UriKind.Relative); 
     Style = dictionary["MyControl"] as Style; 
     Loaded += MyControl_Loaded; 
    } 
} 
  • определяют ленивые частей аксессоров в шаблоне

private Grid _partGrid; 
private Grid PartGrid 
{ 
    get 
    { 
     if (_partGrid == null) 
      _partGrid = (Grid)Template.FindName("PART_Grid", this); 
     return _partGrid; 
    } 
} 

Это работает, но я не уверен, что его самый оптимальный путь :

  • .cs и .xaml отдельные файлы (не один сущностей как и в случае МОФ UserControl);
  • при перемещении xaml (например, внутри папки Controls) код конструктора должен быть отрегулирован;
  • Аксессуар деталей недоступен в конструкторе (шаблон еще не загружен).

Мой вопрос: есть ли лучший способ сделать индивидуальный контроль с шаблоном? Более удобные, автоматический, с автоматическими аксессорами деталей и т.д.


Вот мои шаблоны WPF

+0

Существует настраиваемый шаблон управления. Также шаблон для библиотеки управления. Не знаю, что такое Экспресс, но не ожидайте, что он будет там. –

+0

@JohanLarsson, см. Править, я вижу [здесь] (http://msdn.microsoft.com/en-us/library/windows/apps/hh738343.aspx) на снимке экрана есть «Templated Control», но я не знаю, это есть. Нет такого онлайн-шаблона с таким именем. Ставится ли мой вопрос «как получить шаблонный контроль для экспресс-издания»? Решает ли он проблемы, перечисленные мной? Кроме того, вы говорите «библиотека управления», у меня есть только «библиотека классов» (как новый проект), имеет ли это значение? – Sinatr

+0

@ Sinatr это действительно может быть выражено. я использовал для проверки вещей в экспресс тоже, в котором не было довольно важных шаблонов. может быть и здесь. – Dbl

ответ

0

Это лучше, если вы будете использовать шаблон CustomControl VS, не знает, почему вы не Посмотрите, возможно, потому, что вы используете версию Express. Этот шаблон генерирует Generic.xaml для вас, там вы определяете стиль/controltemplate. Также у вас будет .cs с определением C# вашего элемента управления.

Чтобы получить различные части вашего контроля, рекомендуется использовать метод GetTemplateChild mehtod и передать Part_Name, и вы обычно делаете это, переопределяя метод OnApplyTemplate().

public override void OnApplyTemplate() 
    { 
    base.OnApplyTemplate(); 

    ActionBtn = GetTemplateChild(BtnPartName) as ButtonBase; 
    ContentPopup = GetTemplateChild(PopupPartName) as Popup; 
    } 

Посмотрите на this post, чтобы проверить образец с деталями этой реализации.

Смежные вопросы