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
Antworten:
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 ...
Die Margin
Eigenschaft gibt eine Thickness
Struktur zurück, von der Left
eine Eigenschaft ist. Die Anweisung kopiert den Strukturwert aus der Margin
Eigenschaft und legt den Left
Eigenschaftswert für die Kopie fest. Sie erhalten eine Fehlermeldung, da der von Ihnen festgelegte Wert nicht wieder in der Margin
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 der Margin
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);
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;
Man könnte das einfach benutzen
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
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);
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
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
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.
var
großes Lob für das Nachschlagen des tatsächlichen Typs ... Ich gestehe, mit - ähm, sorry; Ich meine "Verwenden einer geeigneten Sprachfunktion" ;-p