Erstellen Sie eine bindbare Punkt in C# WPF
Ich weiß, multiple inheritence ist, aber gibt es eine Möglichkeit zum erstellen eines wrappers für System.Windows.Zeigen Sie, dass Erben von der es aber noch umzusetzen bindbare abhängigkeitseigenschaften?
Ich versuche zu code, so dass für meine XAML kann ich staments wie die folgende ohne Probleme:
<custom:Point X="{Binding Width, ElementName=ParentControlName}" Y="{Binding Height, ElementName=ParentControlName}" />
Wäre es codieren Dinge wie Polygone, Pfade, LineSegments und andere Steuerelemente so viel einfacher.
Den folgenden code als Wunschdenken und ich verstehe, dass es in keiner Weise funktionieren, aber dies ist die Art von Sache, die ich möchte in der Lage sein zu tun:
public class BindablePoint: DependencyObject, Point
{
public static readonly DependencyProperty XProperty =
DependencyProperty.Register("X", typeof(double), typeof(BindablePoint),
new FrameworkPropertyMetadata(default(double), (sender, e) =>
{
BindablePoint point = sender as BindablePoint;
point.X = (double) e.NewValue;
}));
public static readonly DependencyProperty YProperty =
DependencyProperty.Register("Y", typeof(double), typeof(BindablePoint),
new FrameworkPropertyMetadata(default(double), (sender, e) =>
{
BindablePoint point = sender as BindablePoint;
point.Y = (double)e.NewValue;
}));
public new double X
{
get { return (double)GetValue(XProperty); }
set
{
SetValue(XProperty, value);
base.X = value;
}
}
public new double Y
{
get { return (double)GetValue(YProperty); }
set
{
SetValue(YProperty, value);
base.Y = value;
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider
Point
ist eine Struktur, und Strukturen unterstützen keine Vererbung. Von MSDNVielleicht nicht beantworten Ihre Frage direkt an, aber Sie können ganz einfach binden einen
Point
mit Hilfe eines Konverters. In deinem Fall wäre es wiePointConverter
Wenn Sie nur wollen, binden Sie den X-Wert und einen statischen Wert Y man könnte dies wie
PointXConverter
RotateTransform
hat die EigenschaftenCenterX
undCenterY
statt ein ZentrumPoint
. Dies ermöglicht sehr viel einfachere Bindung an diese Werte, wenn ich sage animieren wollen, eine Drehung oder verknüpfen Sie das Feld, um andere Klassen und Steuerelemente. Sie entschieden sich gegenPoint
dort, und ich bin Wetten, denn es ist viel schwieriger zu verwalten, die Bindungen, wenn Sie nicht.Versuchen, Konverter statt.
Müssen Sie möglicherweise implementieren Sie alle Klassen (
Point
,Polygon
,Line
etc.) von vorne, weilPoint
ist eine Struktur, daher spielt es keine Vererbung unterstützt (was auch erklärt, warum Punkt unterstützt nicht verbindlich: es können nicht ErbenDependencyObject
enthält die notwendige Infrastruktur für die DPs).Gibt es vielleicht einen Weg, obwohl Sie könnte, erstellen Sie eine Unterklasse von polygon und fügen Sie eine neue
DependencyProperty
genannt "BindablePoints
" das wäre eine observable-collection (Sie würde haben, um eine custom-OC würde FeuerCollectionChanged
wenn einer der Punkte geändert) der Punkte. Die Eigenschaft würde in seinerOnChanged
Aktualisierung der wichtigstenPoints
Eigenschaft desPolygon
.Denke ich, dass dies funktionieren könnte, aber ich bin mir nicht sicher, ob es schnell genug für das, was Sie zu tun versuchen. Tou wäre noch zu erstellen, die Unterklassen von all den Formen, die Sie verwenden möchten, aber Sie nicht haben, um Sie zu erstellen alle von Grund auf neu.
Schreiben Sie eine wrapper-Klasse für den Punkt, der die INotifyPropertyChanged-Schnittstelle implementiert
Binden Startpunkt /Endpunkt X-und Y-Eigenschaften zum Beispiel auf eine Linie Instanz