Шаблон элемента управления, который оборачивает другой элемент управления в XAML - PullRequest
2 голосов
/ 14 января 2012

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

Класс 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 предоставит способ, более удобный для выполнения, для чего-то вроде этого, что-то вроде шаблона для украшения / декоратора.

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

Ответы [ 2 ]

2 голосов
/ 14 января 2012

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

1 голос
/ 14 января 2012

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

Если так:

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

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

2) используйте свое текстовое поле:

<ControlTemplate>
    <Border>
        <local:ExtraBorderTextBox />
    </Border>
</ControlTemplate>
...