【问题标题】:When to use a templated control over a UserControl?何时对 UserControl 使用模板化控件?
【发布时间】:2015-03-29 20:33:40
【问题描述】:

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

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

我的意思是,像这样简单的东西:

<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,这样我就可以在处理其 UI 时在 XAML 设计器中看到它,并且我会在后面的 UserControl 代码中添加所有 Properties 和 DependencyProperties。

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

当然,我还必须将 x:Name 属性添加到控件内的一些 UIElement 以便能够与它们交互,但你明白了。

我想知道,可以使用这两种方法中的一种,还是特别使用一种更好,为什么? 另外,我喜欢使用 UserControls,因为我可以在设计器窗口中看到它们,而我无法使用模板来执行此操作,我必须运行应用程序并创建控件的实例以查看它的内容实际上看起来像。

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

塞尔吉奥

【问题讨论】:

  • 您是否向 UserControl 添加了功能?或者只是改变现有控件的显示方式?对于后者,即使是一个控制模板就足够了wpftutorial.net/templates.html
  • 我添加功能:我通常为一些绑定创建一些属性、依赖属性以及可能的动画和其他东西。至于其他功能,我通常为 UserControl 创建一个 ViewModel,并使用它来添加方法和内部绑定。
  • 还有一点需要注意——你可以在 VS 或 Blend 的设计视图中看到模板化控件,只要它们没有任何会破坏设计视图的逻辑。您只需在 UserControl/Page 中使用您的控件实例,它就会显示出来。

标签: xaml windows-runtime uwp win-universal-app uwp-xaml


【解决方案1】:

TLDR

自定义(模板化)控件允许应用使用 Template 属性来替换控件的内部元素树。如果您不需要/不希望您的控件具有该重新模板化功能,请使用 UserControl,因为它更容易。

用户控制

  • UserControl 使用 Visual Studio 或 Blend 更容易创建,为您提供良好的设计视图支持。
  • 您通常使用它在您的应用中通过多个控件组成视图。'
  • 它最适合全屏或全窗口视图,或者如果您有复杂的视图想要分解成更小的、可能可重用的代码块。
  • 如果您选择采用 MVVM 模式,此类视图通常由相应的视图模型支持。

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

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

自定义控件

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

自定义面板

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

【讨论】:

  • 您声称用户控件通常只能在单个应用程序的范围内重复使用是不正确的。我有可以在我的所有项目中完全重复使用的用户控件。对于其余部分,我基本同意,我会删除该声明。
  • 我不确定最后一点“因为控件模板只加载一次......”如果用户控件已经在数据模板中,不应该只解析一次吗?跨度>
  • 这个答案看起来很有趣。 stackoverflow.com/a/44686931/1247637
  • 听起来很合理。 UWP 不是你祖父的 WPF。在开始驾驶之前,您可能不需要太多热身! :) 无论如何-如果您只是将视图的几个部分组件化-您应该完全使用UserControl。如果您正在构建新的交互行为 - 使用自定义控件。如果你把东西放在一个列表中 - 避免使用任何一个并尽可能少地使用元素。再说一遍 - 这些只是一般性建议。您可能会发现无论您做什么 - 无论如何都可以正常工作。在你的表现开始糟糕之前,你不必过度优化或过度思考。
  • 一个重要的区别是UserControl 是从ContentControl 派生的,因此具有公共Content 属性。您的控件的用户可以(意外地)设置此属性(例如,通过将其与 DataContext 属性混淆)并通过完全擦除您的 UserControl 中的 XAML。如果您的控件是用于公共重用的公共 API 的一部分,我建议不要使用 UserControls
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2015-05-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多