何时对 UserControl 使用模板化控件?

When to use a templated control over a UserControl?

我在看一些关于如何在 WinRT 中创建自定义控件的教程,但我有一个问题。

假设我想创建一个简单的控件,其中包含一些内容,例如左侧带有图像、右侧带有几个 TextBlock 的网格。

我的意思是,像这样简单的事情:

<Grid Height="100">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.7*"/>
    </Grid.ColumnDefinitions>
    <Image Source"/Assets/someRandomImage.png"/>
    <StackPanel Grid.Column="1"
                VerticalAlignment="Center">
        <TextBlock Text="Some text"
                   Margin="10,0,10,0"
                   FontSize="24"
                   FontWeight="SemiLight"
                   TextTrimming="CharacterEllipsis"/>
        <TextBlock Text="Some random description..."
                   Margin="10,5,10,0"
                   FontSize="18"
                   FontWeight="Light"
                   Foreground="Gray"
                   TextWrapping="Wrap"
                   TextTrimming="CharacterEllipsis"/>
    </StackPanel>
</Grid>

我会用这个内容创建一个 UserControl,这样我就可以在 XAML Designer 中看到它,而我正在处理它 UI,我会添加所有后面的UserControl代码中的Properties和DependencyProperties。

然后我看到另一种方法是使用模板控件,所以我必须创建一个继承自控件 class 的 class,然后使用上面的 [=34] =] 将代码作为模板并将其应用于自定义控件,然后在其中添加所有其余逻辑。

当然,我还必须将 x:Name 属性 添加到控件中的一些 UI 元素才能与它们交互,但是你得到了想法。

我想知道,使用这两种方法中的任何一种都可以,还是特别使用一种更好,为什么? 此外,我喜欢使用 UserControls,因为我可以在设计器 window 中看到它们,而我无法使用模板来做到这一点,我必须 运行 应用程序并创建一个控件的实例以查看它的实际外观。

谢谢你的帮助,我想我不是唯一有这个疑问的人,所以我希望这个问题也能帮助其他人:D

塞尔吉奥

创建用户控件比创建自定义控件简单得多。 对于初学者,用户控件具有设计器支持。 用户控件的缺点是与自定义控件相比它的局限性。

如果您想创建一个由一些其他控件组成的控件(如您的示例),那么用户控件非常好,但假设您想创建一种特殊类型的面板,那么您真的必须创建一个自定义控件.

所以总而言之,'simple' 控件的用户控件 复杂控件的用户控件。 任何用户控件都可以由自定义控件创建,但反之则不行。

TLDR

自定义(模板化)控件允许应用程序使用模板 属性 替换控件的内部元素树。如果您 need/want 您的控件没有重新模板化功能,那么使用 UserControl 会更容易。

用户控件

  • 使用 Visual Studio 或 Blend 可以更轻松地创建 UserControl,为您提供不错的设计视图支持。
  • 您通常使用它从多个控件在您的应用程序中组成一个视图。'
  • 它最适用于全屏或完整 window 视图,或者如果您有复杂的视图,您希望将其分解为更小的、可能可重复使用的代码块。
  • 如果您选择采用 MVVM 模式,此类视图通常会支持相应的视图模型。

  • UserControl 的一个问题是,虽然您可以在应用程序的多个位置重复使用它,但很难对其在不同位置的外观或行为方式进行微调在你的应用程序中,因为它不使用模板并且 UI 树被加载到构造函数中。

  • 它通常只能在单个应用程序的范围内重复使用。

自定义控件

  • A custom control 或在某些情况下 templated control 最适合用于单一目的的一小块 UI - 它可视化单一的特定类型的信息。
  • 模板化控件可以更改其模板以针对特定用例调整视觉效果。它允许您在一个应用程序中使用一个看起来像默认按钮的按钮,在另一个应用程序中使用一个圆形按钮,在另一个应用程序中使用一个完全由图像组成的按钮。它使它更具可重用性,如果您制作了多个应用程序或想与世界分享您出色的控制,这就很有意义。
  • 一个编写良好的自定义控件通常可以在多个应用程序中重复使用,因为它不依赖于特定应用程序的业务逻辑。
  • 它通常源自现有的平台控件,例如 ButtonToggleButtonContentControlSliderTextBoxListView 添加或覆盖其逻辑。虽然有些情况下从头开始制作一个有意义,子类化 "virtually abstract" ControlItemsControlRangeBaseShape 甚至 FrameworkElement (最后两个没有模板化)。
  • 模板化控件的可视化树在加载模板时加载,这可能发生在控件的可见性首次从 Collapsed 更改为 Visible 时,这允许推迟加载部分UI 以获得性能改进。
  • 因为控件模板只加载一次,所以这些非常适合在任何 ItemsControl 数据模板(列表、网格视图等)中使用。如果您要使用 UserControl,您的性能可能会受到影响,因为 UserControl XAML 被一遍又一遍地解析。

自定义面板

custom panel 是另一种类型的 UI 元素,允许自定义其子元素的布局方式。