2014-12-15 2 views
0

Я борющиеся с шаблонами в WPFПонимание шаблонов

Я понимаю концепцию, что я могу иметь контроль, и ставиться выше ContentTemplate (или аналогичный). Я часто использую его с TabControl

Однако я не понимаю его с точки зрения того, как выглядел первоначальный элемент управления. И если мы ограничены именами. EG, можно ли создать элемент управления и перезаписать NonsenseNameTemplate?

Если бы я должен был создать свой собственный UserControl и предоставить возможность людям переопределять такие вещи, как мой NonsenseNameTemplate, как бы выглядел этот код?

Мое предположение, с псевдо-код будет

<UserControl> 
    <NonsenseNameTempalte> 
      //some resources 
      //some other controls 
    </NonsenseNameTempalte> 
</UserControl> 

В приведенном выше примере, я могу полностью понять, как я мог бы создать новый элемент управления и перезаписать NonsenseNameTemplate, но я не вижу каких-либо примеров кода из UserControl и его использование.

+0

Если вы используете blend, вы можете создать новый шаблон, и он будет использовать исходное содержимое в качестве отправной точки. – Aphelion

+0

У меня нет смеха печально – MyDaftQuestions

+0

Мне просто интересно. Если вы хотите, чтобы у вас был шаблон, который вы классифицируете как рамки, не следует ли использовать Control вместо CustomControl? Может ли кто-нибудь подтвердить, правда ли это? http://wpftutorial.net/CustomVsUserControl.html. – Aphelion

ответ

2

Template - не более чем свойство (зависимость). Написав

<Button> 
    <Button.Template> 
    <ControlTemplate> 
     ... 
    </ControlTemplate> 
    </Button.Template> 
</Button>y 

вы ничего не делаете больше, чем создание нового экземпляра класса ControlTemplate и присвоения его Button.Template свойству этой конкретной кнопки. Каждый элемент управления имеет свой собственный ControlTemplate, сохраненный где-то в его сборке. Как правило, не так просто получить эти шаблоны по умолчанию, но Blend может помочь с этим.

Конечно, вы можете создать свой выигранный NonsenseNameTemplate объект, но на самом деле его использование потребует глубоких знаний о составе, оформлении и рендеринге WPF. Обычно это не требуется для обычного использования WPF. И я согласен с тем, что не так много ресурсов в Интернете, чтобы сделать что-то подобное, именно по этой причине.

+0

Ничего себе ... Я чувствую, какой счастливый легко понять, но все же обманул, но быстро вернулся к счастливой !!! :) Ваше сообщение прекрасно написано и понятно. Я начну копаться в композиции WPF, но по крайней мере я могу понять, что происходит, когда я переписываю назначенные шаблоны. Спасибо. – MyDaftQuestions

+0

@MyDaftQuestions, на самом деле есть много образцов для стилизации, шаблонов, триггеров, зависимостей и т. Д. MS имеет множество шаблонов и стилей по умолчанию, чтобы понять основные базовые компоненты, даже попадая в довольно сложные элементы управления datagrid. – DRapp

+1

@DRapp Но есть ли какая-либо подробная информация о том, как Control.Template фактически реализован? – Euphoric

1

У меня тоже было раннее изучение шаблонов. I posted a step-by-step answer to another question via a customized button control. Хорошая вещь об этом образце, вы можете создавать и играть со стилями и шаблонами в небольшом проекте и увидеть визуальное воздействие, не требуя полной перекомпиляции проекта

1

Начнем с того, как вы упомянули, что у вас нет Blend, , У вас может быть Blend и установить его с помощью сообщества Visual Studio 2013.

Вы можете скачать это здесь, если у вас его еще нет.

http://www.visualstudio.com/products/visual-studio-community-vs

Часть процесса установки, позволяет выбрать и установить Blend. Кроме того, новые версии визуальной студии дают вам некоторую силу смешения. В своем дизайне вы можете щелкнуть правой кнопкой мыши элемент управления и создать или скопировать шаблон.

На вопрос.

As Euphoric упомянутый. Для создания пользовательского контроля требуется немного более глубокое знание WPF или любой из инфраструктур XAML. Тем не менее, есть шаблоны Visual Studio, которые могут помочь вам в правильном направлении.

Что касается имени шаблона, у вас есть три типа шаблонов, которые вы найдете в XAML.ControlTemplate (который для ваших целей является тем, который нас интересует), ItemsPanelTemplate и DataTemplate. Опять же, как сказал Euphoric, существует несколько обстоятельств, когда получение пользовательской версии любого из этих трех шаблонов принесет что-либо в таблицу.

Если вы должны были создать тестовое приложение WPF, как только вы создали основной проект и решение. Пойдите в голову и добавьте еще один проект, а из шаблонов VS предоставит File -> Project -> New -> Windows Desktop. В списке шаблонов проекта найдите «Библиотека пользовательского контроля WPF». После создания обратитесь к этому проекту в свой проект WPF.

Этот пользовательский контрольный библиотека проект предоставит вам схему скелета для того, что вы ищете.

Если вы посмотрите в этом проекте, вот некоторые вещи, которые вы можете отметить.

Firsty, вы найдете папку с именем Темы и в там файл с именем Generic.xaml. Там вы увидите стиль, в котором установлен сеттер Шаблон. Вы также увидите, что как стиля и установить ControlTemplate есть набор TargetType, который должен быть местными: CustomControl1.

Это важно, так как это показывает вам, как создать шаблон пользовательских элементов управления по умолчанию. Теперь, чтобы применить этот шаблон, посмотрите в CustomControl1.cs и рассмотрите следующий код.

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); 

Для этого управления им CustomControl1, этот шаблон мы рассмотрели в XAML автоматически будет установлен в качестве этого шаблона управления по умолчанию, где когда-либо используется, что контроль.

Этот проект является хорошей отправной точкой. Но теперь вы можете переопределить этот элемент управления в своем основном проекте. Это просто. У меня есть код, который выглядит примерно так внутри моего основного проекта WPF.

В верхней части MainWindow.xaml

<Window x:Class="CustomControlTesting.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:CustomControl="clr-namespace:CustomControlTesting.CustomControlLibrary;assembly=CustomControlTesting.CustomControlLibrary" 
     Title="MainWindow" Height="350" Width="525"> 

И в теле,

<CustomControl:CustomControl1> 
    <CustomControl:CustomControl1.Template> 
     <ControlTemplate TargetType="{x:Type CustomControl:CustomControl1}"> 
      <Grid> 
       <!-- Define my look to override the template --> 
       </Grid> 
     </ControlTemplate> 
    </CustomControl:CustomControl1.Template> 
</CustomControl:CustomControl1> 

Это краткий обзор и, конечно, скучает много. Но я надеюсь, что это поможет вам, и вы можете начать.

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