Was ist der Unterschied zwischen einem UserControl und ein ContentControl?

Update

Als Antwort markiert zeigt, Reflektor bestätigt, dass UserControl überschreibt einige Methoden, so dass, während die Benutzeroberfläche ist absolut identisch zwischen den beiden, und Sie können entweder mit dem VS designer, gibt es feine Unterschiede im Verhalten. Ich überlasse es dem Leser zu Forschung, diese Unterschiede mehr, aber hier ist die Unterklasse code...

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);
        }
    }
}

Ursprünglichen Frage:

Laut, alle Unterlagen, wenn Sie die Schaffung eines nicht-lookless Kontrolle, Sie sollen Unterklasse UserControl. Allerdings UserControl ist eine einfache Unterklasse von ContentControl aber es scheint nicht zu etwas hinzufügen, interface-Weise. Als solche, die Sie ergreifen können, die designer-generierten code und ändern Sie die Basis-Klasse ContentControl und es scheint zu funktionieren immer noch genau das gleiche.

Also, was ist der Punkt, der UserControl über ContentControl?

Update: Für diejenigen, die halten die Beantwortung VS behandelt Sie anders, würde ich argumentieren, dass ist nicht der Fall. Versuchen Sie es. Erstellen Sie eine neue UserControl in Visual Studio. Dann in die entstehende XAML-Datei, ändern Sie das root-tag ContentControl. Dann in die zugehörige class-Datei, ändern Sie die Basis-Klasse ContentControl. Es scheint zu funktionieren genau das gleiche, mit voller WYSIWYG-Unterstützung für designer.

Hier ist die aktualisierte 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>

...und die zugehörige class-Datei...

using System.Windows.Controls;

namespace Playground.ComboTest
{
    public partial class InlineTextEditor : ContentControl
    {
        public InlineTextEditor()
        {
            InitializeComponent();
        }
    }
}
  • Die einzige Sache, die unterscheidet sich von ContentControl ist, dass UserControl überschreibt die OnCreateAutomationPeer Methode, könnten Sie sehen, dass für. Vielleicht hat es einige verschiedene UI-Verhalten als die ContentControl.
  • Du bist fast richtig... es überschreibt ein paar andere Dinge (siehe Reflektor.) Still, du bist die erste person, die einen Kommentar auf einen tatsächlichen Unterschied zwischen den beiden, so dass, wenn Sie können legen Sie diese in eine Antwort, ich werde mark Ihrig, der als angenommen ein.
InformationsquelleAutor MarqueIV | 2013-09-13
Schreibe einen Kommentar