2012-01-13 3 views
2

Я хочу создать настраиваемый элемент управления, который расширяет встроенный элемент управления, а затем имеет шаблон, который обертывает этот элемент управления контейнером?Шаблон управления, который обертывает другой элемент управления в XAML

C# класс:

class ExtraBorderTextBox : TextBox {} 

Xaml:

<ControlTemplate> 
    <Border> 
     <TextBox/> 
    </Border> 
</ControlTemplate> 

Это оленья кожа»работа, потому что TextBox в шаблоне управления не мой пользовательский элемент управления, это второй экземпляр.

Мне нужен доступ к свойствам и событиям на TextBox, имея другой родитель, не имеет смысла, мне нужно было бы воспроизвести все это в моем классе.

Это упрощенный пример; Представьте, что Border заменен на ContentControl, который имеет собственный шаблон управления длиной 50 строк. Думаю, я хочу что-то вроде ContentPresenter (как у меня есть в ContentControl), но нет ничего похожего на «ControlPresenter». Правильно? Я что-то упускаю, или я придерживаюсь репликации моего элемента управления содержимым для TextBox или репликации поведения и презентации TextBox для моего контроля содержимого?

Спасибо.

Обновление: Здесь есть ответ, который делает то, что я хочу, чтобы скопировать шаблон по умолчанию для System.Windows.Controls.TextBox. Это будет делать то, что я хочу; Я могу вставить свой контейнер в это. Я надеялся, что WPF предоставит такой способ, который будет более удобен, чтобы сделать что-то подобное, что-то вроде шаблона adorner/decorator.

Есть ли способ сделать это лучше в некотором роде? Использует ли что-то вроде Expression Blend сделать это, чтобы мне не пришлось вручную редактировать XAML, вставленный с веб-страницы?

+0

Что именно вы хотите достичь? – ThomasAndersson

ответ

2

Вы можете использовать шаблон управления по умолчанию в качестве базы и изменить его. Шаблоны управления по умолчанию можно найти здесь: http://msdn.microsoft.com/en-us/library/aa970773.aspx

+1

Я надеялся на что-то более удобное, но это может быть лучшее, что я могу сделать. Кажется, что вам нужно полностью выбросить DRY и SOLID, чтобы сделать что-нибудь в WPF больше, чем прокладывать простые элементы управления в окне. –

1

Если я правильно понял, вы хотите наследовать от TextBox, сделать некоторые переопределения и использовать этот новый класс в XAML.

Если это так:

1) объявить пространство имен Xmlns в верхней части файла:

<UserControl 
... 
xmlns:local="TheAssemblyWhereExtraBorderTextBoxResides" 
...> 

2) использовать свой собственный текстовое поле:

<ControlTemplate> 
    <Border> 
     <local:ExtraBorderTextBox /> 
    </Border> 
</ControlTemplate> 
Смежные вопросы