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, dassUserControl
überschreibt dieOnCreateAutomationPeer
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutzersteuerelemente sind eine gute Passform für die Aggregation vorhandenen Steuerelemente, wenn Sie nicht brauchen, um dem Verbraucher ein ControlTemplate. Dies bedeutet, dass Benutzersteuerelemente sind nicht lookless. Warum nicht einfach ContentControl als es haben kann, gepaart XAML wie ein UserControl und die Umsetzung sieht ähnlich aus wie UserControl? Gut, es gibt mehrere wichtige technische Unterschiede, die Sie wissen müssen:
VisualStateManager.GoToState()
. ContentControl erfordert die VisualStateGroups werden auf dem top-level, und Sie müssen Sie zu rufen, mitVisualStateManager.GoToElementState()
.Grundsätzlich die
UserControl
Klasse ist es für die Bequemlichkeit. Es ermöglicht uns, zu bauen, kleine Teile der Benutzeroberfläche aus bereits vorhandenen Kontrollen, währendContentControl
s sind wirklich für die Erstellung von neuen Kontrollen, in der Regel mit einem einzigen Zweck und/oder Funktionalität.Habe ich ein Buch gelesen, Sie hätten eine gute Erklärung dafür und viel Glück, hat jemand 'legen Sie eine Kopie der online'. Aus dem verlinkten Buch:
Dann in Bezug auf, ob ein
CustomControl
:Schauen Sie für eine umfassende Antwort auf Ihre Frage:
WPF Control Development Unleashed
UPDATE >>>
@MarqueIV, zur Beantwortung Ihrer Frage direkt: Die
UserControl
Klasse wird bereitgestellt, um uns für die Bequemlichkeit. Das ist es. Wenn Sie fügen Sie eine WPF -CustomControl
in Ihr Projekt, Sie werden sehen, dass es keine XAML-Datei. Dies bedeutet, dass Sie müssen Sie control markup in eine Datei namensGeneric.xaml
imThemes
Ordner. DieUserControl
Klasse gibt uns eine XAML-Datei, so dass es einfacher ist, Sie zu schaffen... so ist es bequemer... das ist es. Das ist der Grund.Eine Sache, die sich aus
ContentControl
ist, dassUserControl
überschreibt dieOnCreateAutomationPeer
Methode, könnten Sie sehen, dass für. Vielleicht hat es einige verschiedene UI-Verhalten als dieContentControl
.Diese Methode erzeugt ein
UserControlAutomationPeer
-Instanz.ContentControl
Ein ContentControl direkt abgeleitet von der Klasse Steuerung.
Es beherbergt ein einzelnes element, das kann ein container (z.B. Grid, Stackpanel, ...) hosten selbst mehrere Elemente (z.B. StackPanel mit TextBlock und Bild Kinder).
Sein Aussehen kann verändert werden durch ein DataTemplate.
Sehen MSDN-Abschnitt "Bemerkungen".
UserControl
Ein UserControl leitet sich von ContentControl.
Es unterstützt NICHT Vorlagen, also keine Anpassung.
Es fängt nicht automatisch Scharfstellen, wie ein Fenster.
Noch in der MSDN-Abschnitt "Bemerkungen".
UserControl ist ein zusammengesetztes Steuerelement. Es hat ein ähnliches Konzept mit UserControl in ASP.NET Webforms. Dies bedeutet, es ist ein Steuerelement, das zusammengesetzt ist aus vielen Steuerelementen. In WPF erstellen Benutzer die Kontrolle hat, unterstützt den designer in Visual Studio 2008 oder höher.
ContentControl ist eine Steuerung vorgesehen, über eine einzige Steuerung, wie sein Inhalt.
Weitere Informationen:
http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.aspx
UserControl und ContentControl vielleicht die gleiche Umsetzung, sondern der use case sind nicht das gleiche.
müssen wir zwei Fragen beantworten Wann UserControl oder CustomControl?
und Wann ContentControl?.
so zu verwenden wenn ein Benutzersteuerelement oder CustomControl?
Wann immer ich will eine wiederverwendbare UI -
zum Beispiel, wenn ich eine FileDialogBrowser Bedeutung eine Schaltfläche mit einem TextBlock neben es so, wenn ich drücken Sie die Taste, und ein Benutzer wählt eine Datei-i zeigt die gewählte Datei im TextBlock.
gleiche, aber nicht genau geht für customControl aber hier wollen wir etwas tun, mehr anspruchsvoll, das ist ja eh nicht das Problem.
so zu verwenden wenn ContentControl?
dies ist ein wenig schwierig zu sagen, aber lassen Sie uns sagen, wir wollen eine progressBar mit einer Nachricht
so können wir Erben von BusyIndicator-oder an der Grenze, aber wenn wir ein ContentControl, dass wir die Kontrolle, die Kontrolle über die Inhalte im inneren. wir können es wickeln um andere xaml-Elemente.
hoffe, das hilft