假设我想创建一个简单的控件,其中包含一些东西,例如左边有一个图像的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,10,0" FontSize="24" FontWeight="SemiLight" TextTrimming="CharacterEllipsis"/> <TextBlock Text="Some random description..." Margin="10,5,0" FontSize="18" FontWeight="Light" Foreground="Gray" TextWrapping="Wrap" TextTrimming="CharacterEllipsis"/> </StackPanel> </Grid>
我将创建一个UserControl与这个内容,所以我可以看到它在XAML设计器中,当我在使用它的UI,我将添加所有的属性和DependencyProperties在UserControl代码后面.
然后我看到另一种方法是使用Template控件,所以我必须创建一个继承自Control类的类,然后使用上面的XAML代码作为模板,并将其应用于自定义控件,并添加所有其余的逻辑在那里.
当然,我也必须将X:Name属性添加到控件内的一些UIElements,以便与它们进行交互,但是你可以得到这个想法.
我想知道,使用这两种方法中的任何一种,或者更好地使用一种,尤其是为什么?
此外,我喜欢使用UserControls,因为我可以在Designer窗口中看到它们,而我将无法使用Template来执行此操作,所以我必须运行应用程序并创建一个控件的实例来查看它其实看起来像
感谢您的帮助,我认为我不是唯一有这个疑问的人,所以我希望这个问题也能帮助别人:D
塞尔吉奥
>使用Visual Studio或Blend可以轻松创建UserControl,从而为您提供体面的设计视图支持.
您通常会使用它从多个控件中构建应用程序中的视图.
>它最适用于全屏或全窗口视图,或者您有复杂的视图,您希望在较小的,可重复使用的代码块中分解.
>如果您选择采用MVVM模式,则此类视图通常支持相应的视图模型.
> UserControl的一个问题是,您可以在应用程序的多个位置重复使用它 – 在应用程序的不同位置,对它的外观或行为方式进行轻微的调整是很困难的,因为它不使用模板和UI树被加载到构造函数中.
>通常只能在单个应用程序的范围内重复使用.
自定义控件
>一个自定义控件,或者在某些情况下,模板控件最适合用于单一目的的一小部分UI,它可以显示单个特定类型的信息.
>模板控件可以更改其模板以调整特定用例的视觉效果.它允许你有一个按钮,看起来像一个应用程序的默认按钮,一个圆形的另一个,一个完全由另一个图像.它使它更可重用,这是有道理的,如果你制作多个应用程序或想要与世界分享你的真棒控制.
>一个写得很好的自定义控件通常可以在多个应用程序中重复使用,因为它不依赖于特定应用程序的业务逻辑.
>它通常来自现有的平台控件,例如Button,ToggleButton,ContentControl,Slider,TextBox或ListView,以添加或覆盖其逻辑.有些情况下,从头开始,将“几何抽象”控件,ItemsControl,RangeBase,Shape甚至FrameworkElement(最后两个都不是模板化)进行子类化.
>模板控件的可视化树被加载,当模板加载时,可能发生的时间可能晚到控件的可见性首次从“折叠”更改为“可见”,允许延迟加载部件以获得性能改进.
>因为控件模板只能加载一次,所以这些是在任何ItemsControl DataTemplate(列表,网格视图等)中使用的理想选择.如果您使用UserControl,您的性能可能会受到影响,因为UserControl XAML一遍又一遍被解析.
自定义面板