Проблема с производными ControlTemplates в WPF - PullRequest
1 голос
/ 11 марта 2010

Работает следующий код xaml:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <ControlTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </ControlTemplate>
  </Button.Template>
 </Button>
</Window>

Теперь, если вы определите следующий шаблон данных:

using System.Windows.Controls;

namespace DerivedTemplateBug
{
 public class DerivedTemplate : ControlTemplate
 {
 }
}

А затем поменяйте шаблон ControlTemplate для производного класса:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <local:DerivedTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </local:DerivedTemplate>
  </Button.Template>
 </Button>
</Window>

Вы получаете следующую ошибку:

Недопустимый атрибут ContentPropertyAttribute для типа «DerivedTemplateBug.DerivedTemplate», свойство «Content» не найдено.

Может кто-нибудь сказать мне, почему это так?

1 Ответ

0 голосов
/ 12 марта 2010

Я получаю другую ошибку, когда пытаюсь это:

'Border' object cannot be added to 'DerivedTemplate'. 
Object of type 'System.Windows.Controls.Border' cannot be converted 
to type 'System.Windows.FrameworkElementFactory'.

Глядя вверх FrameworkElementFactory, кажется, что это был старый способ создания шаблонов в коде:

Этот класс является устаревшим способом программно создавать шаблоны, которые являются подклассами FrameworkTemplate, такой как ControlTemplate или DataTemplate; не все функциональные возможности шаблона доступно при создании шаблона используя этот класс.

Мой вопрос: почему вы наследуете от ControlTemplate? Я не могу придумать вариант использования для этого. Если вы просто пытаетесь создать свои собственные шаблоны в программном коде, MSDN рекомендует следующий подход:

Рекомендуемый способ программно создать шаблон загрузить XAML из строки или памяти поток с помощью метода Load из Класс XamlReader.

...