Обновление
Как показано в помеченном ответе, Reflector подтверждает, что UserControl переопределяет несколько методов, поэтому, хотя интерфейс полностью идентичен между этими двумя, и вы можете использовать любой из них с конструктором VS, есть небольшие различия в поведении. Я оставлю это на усмотрение читателя, чтобы изучить эти различия больше, но здесь код подкласса...
public class UserControl : ContentControl
{
// Fields
private static DependencyObjectType _dType;
// Methods
static UserControl()
{
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
typeof(UserControl),
new FrameworkPropertyMetadata(typeof(UserControl)));
_dType = DependencyObjectType.FromSystemTypeInternal(
typeof(UserControl));
UIElement.FocusableProperty.OverrideMetadata(
typeof(UserControl),
new FrameworkPropertyMetadata(BooleanBoxes.FalseBox));
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(
typeof(UserControl),
new FrameworkPropertyMetadata(BooleanBoxes.FalseBox));
Control.HorizontalContentAlignmentProperty.OverrideMetadata(
typeof(UserControl),
new FrameworkPropertyMetadata(HorizontalAlignment.Stretch));
Control.VerticalContentAlignmentProperty.OverrideMetadata(
typeof(UserControl),
new FrameworkPropertyMetadata(VerticalAlignment.Stretch));
}
internal override void AdjustBranchSource(RoutedEventArgs e)
{
e.Source = this;
}
protected override AutomationPeer OnCreateAutomationPeer()
{
return new UserControlAutomationPeer(this);
}
// Properties
internal override DependencyObjectType DTypeThemeStyleKey
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return _dType;
}
}
internal override FrameworkElement StateGroupsRoot
{
get
{
return (base.Content as FrameworkElement);
}
}
}
Оригинальный вопрос:
Согласно всей документации, когда вы создаете элемент управления без внешнего вида, вы должны создавать подкласс UserControl
. Тем не менее, UserControl
является простым подклассом ContentControl
, но он, похоже, ничего не добавляет к нему с точки зрения интерфейса. Таким образом, вы можете взять этот сгенерированный дизайнером код и изменить базовый класс на ContentControl
, и он, похоже, будет работать точно так же.
Так какой смысл UserControl
над ContentControl
?
Обновление: для тех, кто продолжает отвечать на вопросы VS, я считаю, что это не так. Попробуй. Создайте новый UserControl
в Visual Studio. Затем в полученном XAML файле измените корневой тег на ContentControl
. Затем в связанном файле класса измените базовый класс на ContentControl
. Похоже, что он работает точно так же, включая полную поддержку дизайнера WYSIWYG.
Здесь обновленный 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>
... и связанный файл класса...
using System.Windows.Controls;
namespace Playground.ComboTest
{
public partial class InlineTextEditor : ContentControl
{
public InlineTextEditor()
{
InitializeComponent();
}
}
}