WPF控件模板控件嵌套vs Grid

问题描述 投票:0回答:1

我正在为 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
,这在计算上有点昂贵)。它们等价吗?或者我遗漏了什么而第二种方法有一些缺点?

wpf controltemplate
1个回答
1
投票

它们等同。

例如,在命中测试时唯一会检测到的边界部分是边界线本身,除非边界有背景(此处可以接受透明)或命中可测试内容。

如果我们在

Border
中添加触发器以在
IsMouseOver
时对
true
作出反应,那么如果
ContentPresenter
Border
之外,则无论
ContentPresenter
的内容如何,它都不会触发。如果
ContentPresenter
Border
的内部,那么提供
ContentPresenter
内容既填充了鼠标光标悬停的区域,又是可测试的,那么它将触发。这个场景假设我们没有设置背景。

这是我想到的唯一区别,我认为这是一个小区别。我想还有更多,尽管我怀疑有人会/已经深入研究了它们。

此外,这假设我们修改

Border
以添加所述触发器。如果我们在不修改原始代码的情况下谈论任何差异,那么我不能在这里给你一个具体的答案——不过我怀疑没有。

我假设我们没有修改任何

Border
属性。但是,如果我们要这样做,那么添加一个大于 0 的
BorderThickness
将是一个明显的区别,因为非嵌套版本中的内容可能会与边界线重叠。

© www.soinside.com 2019 - 2024. All rights reserved.