我正在为 WPF 编写自定义控件模板并使用默认控件模板作为启动器。
当content presenter需要一些背景或前景或外边框时,它通常与设置颜色属性的
Border
控件结合使用。我发现默认模板中使用了两种方法(发布在 MSDN 上):
<ControlTemplate TargetType="{x:Type ControlType}">
<Grid>
<Border Background="{TemplateBinding Background}"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
这将在内容演示者后面放置一些背景。但是,我可以摆脱
Grid
并将内容演示者放在边框内:
<ControlTemplate TargetType="{x:Type ControlType}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
</ControlTemplate>
相同的行为,减去网格控件。我倾向于使用第二种方法只是因为我摆脱了额外的控制(尤其是
Grid
,这在计算上有点昂贵)。它们等价吗?或者我遗漏了什么而第二种方法有一些缺点?
它们不等同。
例如,在命中测试时唯一会检测到的边界部分是边界线本身,除非边界有背景(此处可以接受透明)或命中可测试内容。
如果我们在
Border
中添加触发器以在 IsMouseOver
时对 true
作出反应,那么如果 ContentPresenter
在 Border
之外,则无论 ContentPresenter
的内容如何,它都不会触发。如果 ContentPresenter
在 Border
的内部,那么提供 ContentPresenter
内容既填充了鼠标光标悬停的区域,又是可测试的,那么它将触发。这个场景假设我们没有设置背景。
这是我想到的唯一区别,我认为这是一个小区别。我想还有更多,尽管我怀疑有人会/已经深入研究了它们。
此外,这假设我们修改
Border
以添加所述触发器。如果我们在不修改原始代码的情况下谈论任何差异,那么我不能在这里给你一个具体的答案——不过我怀疑没有。
我假设我们没有修改任何
Border
属性。但是,如果我们要这样做,那么添加一个大于 0 的BorderThickness
将是一个明显的区别,因为非嵌套版本中的内容可能会与边界线重叠。