首页 文章

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

提问于
浏览
21

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

假设我想创建一个包含一些东西的简单控件,比如左边是图像的网格,右边是几个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>

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

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

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

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

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

塞尔吉奥

2 回答

  • 24

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

    如果您想要创建一个控件,该控件由您的示例中的某些其他控件组成,但是假设您想要创建一种特殊类型的面板,那么您真的必须创建一个自定义控件 .

    因此,总结用户控制“简单”控制复杂控件的用户控件 . 任何用户控件都可以由自定义控件创建,但不能相反 .

  • 3

    UserControl

    • 使用Visual Studio或Blend可以更轻松地创建 UserControl ,为您提供体面的设计视图支持 .

    • 您通常使用它从多个控件组合应用中的视图 .

    • 最适合全屏或全窗口视图,或者如果您想要在较小的,可能可重复使用的代码块中分离复杂视图 .

    • 如果选择采用MVVM模式,则通常使用相应的视图模型支持此类视图 .

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

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

    Custom control

    • A custom control 或者在某些情况下 templated control 最适合用于单一目的的一小部分UI - 它可视化单个特定类型的信息 .

    • 模板化控件可以更改其模板以调整特定用例的视觉效果 . 它允许您在一个应用程序中有一个看起来像默认按钮的按钮,在另一个应用程序中有一个圆形的按钮,而另一个应用程序中只有一个图像 . 如果您制作多个应用程序或希望与全世界分享您的精彩控制权,那么它就更有可重用性 .

    • 编写良好的自定义控件通常可以在多个应用程序中重用,因为它不依赖于特定应用程序的业务逻辑 .

    • 它通常派生自现有平台控件,例如 ButtonToggleButtonContentControlSliderTextBoxListView ,以添加或覆盖其逻辑 . 有些情况虽然从头开始制作一个是有意义的,继承"virtually abstract" ControlItemsControlRangeBaseShape 甚至 FrameworkElement (最后两个都没有模板化) .

    • 加载模板时会加载模板化控件的可视化树,这可能会在控件的可见性从 Collapsed 更改为 Visible 时发生,这样可以推迟加载UI的各个部分以获得性能改进 .

    • 因为控件模板只加载一次,所以它们非常适合在任何ItemsControl DataTemplate(列表,网格视图等)中使用 . 如果您要使用UserControl,您的性能可能会受到影响,因为UserControl XAML会被反复解析 .

    Custom panel

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

相关问题