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

Ser*_*694 21 xaml windows-runtime win-universal-app uwp uwp-xaml

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

假设我想创建一个包含一些东西的简单控件,比如左边是图像的Grid,右边是几个TextBlocks.

我的意思是,简单的事情:

<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>
Run Code Online (Sandbox Code Playgroud)

我会用这个内容创建一个UserControl,所以当我正在处理它的UI时,我将能够在XAML Designer中看到它,并且我将在UserControl代码中添加所有Properties和DependencyProperties.

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

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

我想知道,使用这两种方法中的任何一种方法都可以,或者更好地使用一种方法,为什么呢?此外,我喜欢使用UserControls,因为我可以在Designer窗口中看到它们,而我无法使用模板执行此操作,我必须运行应用程序并创建控件的实例以查看它是什么实际上看起来像.

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

塞尔吉奥

Fil*_*kun 25

用户控件

  • UserControl使用Visual Studio或Blend创建A 会更容易,为您提供体面的设计视图支持.
  • 您通常使用它从多个控件组成应用中的视图.
  • 它最适用于全屏或全窗口视图,或者如果您有复杂的视图,您希望在较小的,可能可重用的代码块中分离.
  • 如果您选择采用MVVM模式,则此类视图通常以相应的视图模型为后盾.

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

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

自定义控制

  • A custom control或某些情况下templated control最适合用于单一目的的一小部分UI - 它可视化单个特定类型的信息.
  • 模板化控件可以更改其模板以调整特定用例的视觉效果.它允许您在一个应用程序中使用一个看起来像默认按钮的按钮,在另一个应用程序中使用圆形按钮,而在另一个应用程序中只有一个图像.如果您制作多个应用程序或希望与全世界分享您的精彩控制权,那么它就更具可重用性.
  • 编写良好的自定义控件通常可以在多个应用程序中重用,因为它不依赖于特定应用程序的业务逻辑.
  • 它通常从现有的平台控制导出,如Button,ToggleButton,ContentControl,Slider,TextBoxListView可添加到或替代它的逻辑.在有些情况下,虽然当它是有道理的,使一个从无到有,继承"虚拟抽象" Control,ItemsControl,RangeBase,Shape甚至FrameworkElement(最后两个没有模板).
  • 加载模板时会加载模板化控件的可视化树,这可能会在控件的可见性首次更改时发生Collapsed,Visible从而允许延迟加载UI的部分以获得性能改进.
  • 由于控件模板仅加载一次,因此非常适合在任何ItemsControl DataTemplate(列表,网格视图等)中使用.如果您要使用UserControl,您的性能可能会受到影响,因为UserControl XAML会被反复解析.

自定义面板

A custom panel是另一种类型的UI元素,允许自定义它如何布置其子元素.

  • 这个答案看起来很有趣 /sf/answers/3128085201/ (2认同)
  • 听起来很合理。UWP 不是你祖父的 WPF。在开始驾驶之前,您可能不需要预热太多!:) 无论如何-如果您只是将视图的几个部分组件化-您应该完全使用`UserControl`。如果您正在构建新的交互行为 - 使用自定义控件。如果你把东西放在一个列表中 - 避免使用任何一个并使用尽可能少的元素。再说一遍 - 这些只是一般性建议。您可能会发现无论您做什么 - 无论如何都可以正常工作。在您的性能开始下降之前,您不必过度优化或过度思考。 (2认同)