24

我正在寻找一些关于如何在 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,因此在我处理其 UI 时,我将能够在 XAML 设计器中看到它,并且我将在后面的 UserControl 代码中添加所有 Properties 和 DependencyProperties。

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

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

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

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

塞尔吉奥

4

2 回答 2

28

TLDR

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

用户控制

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

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

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

自定义控件

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

自定义面板

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

于 2015-03-30T05:58:54.460 回答
3

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

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

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

于 2015-03-29T20:43:45.467 回答