В чем разница между пользовательским элементом управления и ContentControl?

Обновление

Как показывает помеченный ответ, 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();
        }
    }
}
16
задан MarqueIV 15 October 2019 в 04:17
поделиться