WPF ControlTemplate частичная замена - PullRequest
8 голосов
/ 27 января 2010

Предположим, у нас есть очень 'XAML long' ControlTemplate для нашего Control. И мы хотим, чтобы добавил всего 1 кнопку в шаблон . MSDN утверждает, что « Нет способа заменить только часть визуального дерева элемента управления ». Мне действительно нужно скопировать весь этот ControlTemplate и добавить к нему мою кнопку?

Или: есть ли возможность предоставить какой-то интерфейс для определенного элемента? Например, TextBox, чтобы каждый мог легко его шаблонировать без повторного ввода всего шаблона ControlTemplate.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 29 января 2010

Как сказал qntmfred, вы не можете сделать это напрямую. Однако если у вас есть элемент управления, который вы хотите настроить (что звучит так, как вы), то вы можете сделать это, добавив подходящие свойства настройки, такие как свойство CustomButtons (к которому каждый пользователь элемента управления может добавить свои собственные кнопки ) или свойство ExtensionContent (которое каждый пользователь элемента управления может установить для любого содержимого, которое он хочет - оставьте его пустым, добавьте один элемент управления или добавьте панель с таким количеством элементов, как они хотят). Ваш ControlTemplate не будет назначать семантику этим свойствам, а просто размещать их так, как они были им заданы. Например, предположим, что вы предоставили свойство ExtensionContent. Ваш ControlTemplate может представить это с помощью ContentPresenter:

<ContentPresenter ContentSource="ExtensionContent" />

И ваши пользователи могут положить в нее все, что захотят:

<s:StefansControl>
  <s:StefansControl.ExtensionContent>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="I'm custom content" />
      <Button Click="DoSomethingSurprising_Click">Click me</Button>
      <Image Source="something.jpg" />
    </StackPanel>
  </s:StefansControl.ExtensionContent>
</s:StefansControl>

Другим возможным является предоставление свойств стиля, которые вы применяете к частям вашего элемента управления, чтобы пользователи могли их стилизовать (включая изменение шаблона этой части (только) элемента управления) без замены всего стиля / шаблон. Это своего рода идея «интерфейса к конкретному элементу», например предоставить свойство FooBoxStyle, которое применяется к TextBox "foo".

Короче говоря, идея состоит в том, чтобы встроить определенную меру "частичной замены" в базовый шаблон - будь то с помощью контента, стилей, шаблонов или их комбинации. WPF не предоставляет общего понятия «частичная замена», но вы можете указать собственное понятие частичной замены при условии, что вы можете предсказать, какой тип частичной замены может потребоваться.

0 голосов
/ 01 декабря 2010

На самом деле вы можете. Это не самый удобный способ, но вот как вы это делаете: Клонирование WPF ControlTemplate

0 голосов
/ 27 января 2010

MSDN правильный. Нужно скопировать весь шаблон ControlTemplate.

...