在XAML中包装另一个控件的控制模板

时间:2012-01-13 23:09:24

标签: wpf templates xaml coding-style custom-controls

我想创建一个扩展内置控件的自定义控件,然后有一个用容器包装该控件的模板?

C#类:

class ExtraBorderTextBox : TextBox {}

Xaml:

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

这不起作用,因为控件模板中的TextBox不是我的自定义控件,而是第二个实例。

我需要访问TextBox上的属性和事件,有一个不同的父母没有意义,我将不得不复制我班上的所有内容。

这是一个简化的例子;将Border替换为具有50行控制模板的ContentControl。我想我想要ContentPresenter之类的东西(就像我在ContentControl中那样),但没有像“ControlPresenter”那样的东西。对?我是否遗漏了某些内容,或者我是否因为复制TextBox的内容控件或为我的内容控件复制TextBox行为和演示而烦恼?

感谢。

更新: 这里有一个答案可以实现我想要的,即复制System.Windows.Controls.TextBox的默认模板。这将做我想要的;我可以将我的容器插入其中。我希望WPF提供一种更易于维护的方式来做这样的事情,比如装饰/装饰模式。

有什么方法可以在某种程度上改善这种状况吗?使用像Expression Blend这样的东西可以做到这一点,这样我就不必手工编辑从网页上粘贴的XAML了吗?

2 个答案:

答案 0 :(得分:2)

您可以使用默认控件模板作为基础并进行修改。可以在此处找到默认控件模板:http://msdn.microsoft.com/en-us/library/aa970773.aspx

答案 1 :(得分:1)

如果我理解正确,你想继承TextBox,做一些覆盖,并在XAML中使用那个新类。

如果是这样的话:

1)在文件顶部声明xmlns名称空间:

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

2)使用您的自定义文本框:

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