根据所有的文档,当您创建一个非查找控件时,您应该对UserControl
进行子类。然而,UserControl
是ContentControl
的一个简单子类,但它似乎并没有向它添加任何东西,在接口方面。因此,您可以使用设计器生成的代码并将基类更改为ContentControl
,而且它的工作方式似乎仍然完全相同。
那么UserControl
在ContentControl
上有什么意义呢?
更新:
对于那些不断回答Visual的人来说,我认为情况并非如此。试试看!在Visual中创建一个新的UserControl
,然后在生成的XAML文件中将根标记更改为ContentControl
。然后,在关联的类文件中,将基类更改为ContentControl
,或者像我在这里所做的那样简单地删除它(参见注释),您将看到它的工作方式完全相同,包括对WYSIWYG的完整支持。
注意:您可以从代码隐藏中删除基类,因为它实际上是一个部分类,XAML设计器通过代码生成创建了类的另一部分。因此,基类将始终被定义为XAML文件的根元素,因此您可以简单地在代码隐藏中省略它,因为它是多余的。
这是最新的XAML..。
<ContentControl x:Class="Playground.ComboTest.InlineTextEditor"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBlock Text="Success" />
</ContentControl>
...and相关的类文件..。
namespace Playground.ComboTest {
public partial class InlineTextEditor {
public InlineTextEditor()
=> InitializeComponent();
}
}
发布于 2017-01-18 14:41:47
当您不需要为使用者提供一个UserControls时,ControlTemplate很适合聚合现有的控件。这意味着UserControls不是没有外观的。为什么不直接使用ContentControl,因为它可以像UserControl那样耦合XAML,并且实现看起来类似于UserControl?嗯,有几个重要的技术差异你必须知道:
VisualStateManager.GoToState()
更改VisualStates。ContentControl要求VisualStateGroups位于顶层,您必须用VisualStateManager.GoToElementState()
调用它们。内容控制的ControlTemplate
<ControlTemplate TargetType="ContentControl">
<ContentPresenter
Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" />
</ControlTemplate>
用户控件的ControlTemplate
<ControlTemplate TargetType="UserControl">
<Border BorderBrush="{TemplateBinding Border.BorderBrush}"
BorderThickness="{TemplateBinding Border.BorderThickness}"
Background="{TemplateBinding Panel.Background}"
Padding="{TemplateBinding Control.Padding}"
SnapToDevicePixels="True">
<ContentPresenter
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
Content="{TemplateBinding ContentControl.Content}" />
</Border>
</ControlTemplate>
发布于 2013-09-13 08:39:49
基本上,UserControl
类是为了方便而存在的。它使我们能够从已经存在的控件构建UI的小部分,而ContentControl
实际上是用来创建新控件的,通常只有一个用途和/或功能。
我读了一本对此有很好解释的书,幸运的是,有人把它放在了网上。从链接的书中:
UserControl类是一个容器类,充当相关控件集合的“黑匣子”容器。如果您需要一个由三个控件组成的集合来始终显示在一起,并且允许彼此轻松地交谈,那么可能会出现的一个候选控件是UserControl类。
然后与是否创建CustomControl
有关
以下是决定过程的摘要: 尽可能多地使用框架。WPF提供了各种可扩展控件,因此请确保您想要的功能在WPF控件中不存在。 在许多情况下,您所使用的数据结构需要不同的可视化表示。使用ControlTemplates和DataTemplates通常可以获得所需的功能。 看看ValueConverters,看看它们是否能帮助弥合股票功能和您需要的之间的差距。 最后,查看是否无法使用附加属性扩展现有行为。
看看你的问题有一个深入的答案:
更新>>>
@MarqueIV,更直接地回答您的问题:为了方便起见,我们提供了UserControl
类。就这样。如果将WPF CustomControl
添加到您的项目中,您将看到它没有XAML文件。这意味着您必须在Generic.xaml
文件夹中的一个名为Themes
的文件中设计控制标记。UserControl
类为我们提供一个XAML文件,以便更容易地创建它们.所以更方便..。就这样。这就是原因。
发布于 2013-09-13 09:05:54
与ContentControl
不同的是,UserControl
重写了OnCreateAutomationPeer
方法,您可能会查找它。也许它有一些不同于ContentControl
的UI行为。
此方法创建一个-instance。
https://stackoverflow.com/questions/18781679
复制相似问题