【问题标题】:What is the difference between modifying a control by altering the control template and adding sub controls通过更改控件模板来修改控件和添加子控件有什么区别
【发布时间】:2010-11-01 02:30:05
【问题描述】:

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

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

我们还可以使用内容模型编辑控件。即,

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

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

【问题讨论】:

    标签: wpf xaml controls wpf-controls


    【解决方案1】:

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

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

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

    【讨论】:

    • 控件的内容肯定是可重用的,要么通过将元素定义为资源并使用 ContentControls,要么将内容分配为 DataTemplate。
    • 我想如果你使用 ContentControl 或 DataTemplate 的话,原问题中的 #2 就不一样了。
    【解决方案2】:

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

    至于正确的做事方式,取决于你想要达到的目标。如果您尝试更改控件,例如外观或行为,那么using a ControlTemplate(或 DataTemplate,取决于您正在模板化的内容)绝对是要走的路。 CheckBox 就是一个很好的例子,不管你信不信,CheckBox 实际上是一个 ToggleButton (more or less),through templating 在一个项目符号中显示可切换性。 Here's 另一个很好的例子,说明了如何使用模板来做一些非常漂亮的事情。

    ControlTemplates 也应该是applied through Styles,而不是直接设置在元素上。

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

    WPF does this better then Silverlight,虽然不知道SL3有没有改进。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-22
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2013-03-05
        相关资源
        最近更新 更多