1

我是 WPF 新手,我对修改控件有疑问。我开始知道可以通过更改控件模板来修改控件。IE,

<Button>
  <Button.Template>
    <ControlTemplate>
      ...
    </ControlTemplate>
  </Button.Template>
</Button>

我们还可以使用Content Model编辑控件。IE,

<Button>
  <Grid>
    <CheckBox>
    </CheckBox>
    <RadioButton>
    </RadioButton>
    ...
  </Grid>
</Button>

这两种技术有什么区别。哪一种是在 WPF 中自定义控件的正确方法。请帮助我更好地理解这一点。

4

3 回答 3

3

这两件事之间的主要区别在于ControlTemplate定义了控件的外观。它实际上并没有在其中放置内容。在内容控件内的某个位置,应该有某种形式的ContentPresenter。内置控件能够做到这一点,因为它们被称为“无外观控件”,并且创建的任何自定义控件也应该是无外观的。当一个控件不是以一种不美观的方式模板化而是具有一个静态布局时,就会发生您遇到的混乱。

至于正确的做事方式,这取决于您要达到的目标。如果您尝试更改控件,例如外观或行为,那么使用 ControlTemplate(或 DataTemplate,取决于您的模板)绝对是要走的路。一个很好的例子就是 CheckBox,信不信由你,CheckBox 实际上是一个 ToggleButton(或多或少),它通过模板在项目符号中显示可切换性。 这是另一个很好的例子,说明如何使用模板来做一些非常漂亮的事情。

ControlTemplates 也应该通过 Styles 应用,而不是直接设置在元素上。

如果您实际上并不打算修改控件的行为或外观,那么使用内容模型是正确的方法。

WPF 比 Silverlight 做得更好,虽然我不知道 SL3 是否有改进。

于 2009-06-08T07:44:24.287 回答
1

我的经验法则是,如果可以在不更改控件模板的情况下获得我想要的东西,那么您不应该更改控件​​模板。

控件模板是一种更改控件外观的方法,例如制作一个圆形按钮来更改复选框的复选标记图形。

在控件中添加控件更简单,例如在按钮中放置图像。

还要记住,控件模板中有很多功能,包括填充、内容对齐、禁用外观等等,如果您更改控件模板,则必须添加对所有这些功能的支持。

于 2009-06-08T10:48:31.310 回答
0

模板可以放置到资源中并重新用于另一个按钮。

直接更改内容是不可重用的,除非您从中创建一个 UserControl。

您使用哪一个取决于具体任务和您的个人喜好。

于 2009-06-08T07:20:35.427 回答