Прежде всего, ваш пользовательский TabItem
должен переопределить метаданные, чтобы подобрать правильный стиль на основе вашего нового типа, а не вашего базового класса (извинения - я использовал C #, потому что я недостаточно опытен в VB):
public static CodePage()
{
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
typeof(CodePage),
new FrameworkPropertyMetadata(typeof(CodePage)));
}
Это позволит вам определить стиль по умолчанию в вашей теме (Generic.xaml) следующим образом:
<Style TargetType="{x:Type local:CodePage}">
...
</Style>
В этом стиле вы можете определить шаблон. Это сообщает WPF, как визуализировать этот элемент управления, когда его экземпляр найден в логическом дереве.
Судя по всему, вы создали элементы управления в коде, а не в своем шаблоне. Это ошибка. Вместо этого вы должны определить свойства зависимостей для хранения данных в вашем классе CodePage
и определить внешний вид в вашем шаблоне (будь то текстовые поля, расширенные текстовые поля или что-то еще). Пример шаблона может выглядеть так:
<Style ...>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CodePage}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox Text="{TemplateBinding Property1}"/>
<TextBox Grid.Column="1" Text="{TemplateBinding Property2}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
Тогда я смог бы использовать ваш класс CodePage следующим образом:
<TabControl>
<whatever:CodePage Header="Hello" Property1="Foo" Property2="Bar"/>
</TabControl>
Скорее всего, вам понадобится пользовательский TabControl
, который переопределяет генерацию контейнера для возврата экземпляров вашего CodePage
вместо TabItem
, но это уже другая история.