MyControl.Margin.Left = 10;
Error:
Der Rückgabewert von 'System.Windows.FrameworkElement.Margin' kann nicht geändert werden, da es sich nicht um eine Variable handelt
Das Problem ist, dass Margin
es sich um eine Eigenschaft handelt und dass type ( Thickness
) ein Werttyp ist. Das heißt, wenn Sie auf die Eigenschaft zugreifen, erhalten Sie eine Kopie des Werts zurück.
Obwohl Sie den Wert der Eigenschaft für einen bestimmten Wert ändern könnenThickness.Left
(grr ... veränderbare Werttypen sollten nicht vorhanden sein), wird der Rand nicht geändert.
Stattdessen müssen Sie die Margin
Eigenschaft auf einen neuen Wert setzen. Zum Beispiel (zufällig der gleiche Code wie Marc):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Als Hinweis für das Bibliotheksdesign hätte ich es sehr bevorzugt, wenn Thickness
es unveränderlich gewesen wäre, aber mit Methoden, die einen neuen Wert zurückgaben, der eine Kopie des Originals war, aber einen Teil ersetzte. Dann könnten Sie schreiben:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Keine Sorge um seltsames Verhalten von veränderlichen Werttypen, nett und lesbar, alles ein Ausdruck ...
var
großes Lob für das Nachschlagen des tatsächlichen Typs ... Ich gestehe, mit - ähm, sorry; Ich meine "Verwenden einer geeigneten Sprachfunktion" ;-pDie
Margin
Eigenschaft gibt eineThickness
Struktur zurück, von derLeft
eine Eigenschaft ist. Die Anweisung kopiert den Strukturwert aus derMargin
Eigenschaft und legt denLeft
Eigenschaftswert für die Kopie fest. Sie erhalten eine Fehlermeldung, da der von Ihnen festgelegte Wert nicht wieder in derMargin
Eigenschaft gespeichert wird .(In früheren Versionen von C # konnten Sie dies einfach tun, ohne sich zu beschweren, was in Newsgroups und Foren viele Fragen dazu verursachte, warum eine solche Aussage überhaupt keine Wirkung hatte ...)
Um die Eigenschaft festzulegen, müssen Sie die
Thickness
Struktur aus derMargin
Eigenschaft abrufen, den Wert festlegen und zurückspeichern:Thickness m = MyControl.Margin; m.Left = 10; MyControl.Margin = m;
Wenn Sie alle Ränder festlegen möchten, erstellen Sie einfach eine
Thickness
Struktur und legen Sie alle gleichzeitig fest:MyControl.Margin = new Thickness(10, 10, 10, 10);
quelle
Margin
gibt eine Struktur zurück, was bedeutet, dass Sie eine Kopie bearbeiten . Sie benötigen so etwas wie:var margin = MyControl.Margin; margin.Left = 10; MyControl.Margin = margin;
quelle
Man könnte das einfach benutzen
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
quelle
Man würde vermuten (und mein WPF ist momentan ein wenig verrostet), dass Margin ein Objekt nimmt und nicht direkt geändert werden kann.
z.B
MyControl.Margin = new Margin(10,0,0,0);
quelle
Zur Verwendung müssen
Thickness
Sie Ihre Projektplattformversion.NET framework
auf 4.5 erstellen / ändern . da diese Methode nur in Version 4.5 verfügbar ist. (Sie können auch einfach PresentationFramework.dll herunterladen und auf diese DLL verweisen, ohne Ihre.NET framework
Version auf 4.5 zu erstellen / zu ändern .)Wenn Sie dies jedoch einfach tun möchten, können Sie diesen Code verwenden:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
ebenfalls
MyControl.Margin = new Padding(int all);
Dies ist einfach und erfordert keine Änderungen an Ihrem Projekt
quelle
Abhängig von der Situation können Sie hier auch die Padding-Eigenschaft verwenden ...
MyControl.Margin=new Padding(0,0,0,0);
quelle
Rand = neue Dicke (0, 0, 0, 0);
quelle
Es ist ein bisschen unklar, was Sie fragen, aber um es sich bequem zu machen, können Sie Ihr eigenes Steuerelement erben und eine Eigenschaft mit dem von Marc vorgeschlagenen Code hinzufügen:
class MyImage : Image { private Thickness thickness; public double MarginLeft { get { return Margin.Left; } set { thickness = Margin; thickness.Left = value; Margin = thickness; } } }
Dann können Sie im Client-Code einfach schreiben
MyImage img = new MyImage(); img.MarginLeft = 10; MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
quelle
MerginLeft
vorhaben, die an mehreren Stellen im Projekt zu ändern , werden durch die Vererbung Entwurfsprobleme vermieden. Wenn dies ein einzelner Ort in Ihrem Projekt ist, würde ich natürlich die akzeptierte Antwort wählen.