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 Margines 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 MarginEigenschaft 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 Thicknesses 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 MarginEigenschaft gibt eine ThicknessStruktur zurück, von der Lefteine Eigenschaft ist. Die Anweisung kopiert den Strukturwert aus der MarginEigenschaft und legt den LeftEigenschaftswert für die Kopie fest. Sie erhalten eine Fehlermeldung, da der von Ihnen festgelegte Wert nicht wieder in der MarginEigenschaft 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 ThicknessStruktur aus der MarginEigenschaft 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 ThicknessStruktur und legen Sie alle gleichzeitig fest:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Margingibt 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 ThicknessSie Ihre Projektplattformversion .NET frameworkauf 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 frameworkVersion 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
MerginLeftvorhaben, 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.
vargroßes Lob für das Nachschlagen des tatsächlichen Typs ... Ich gestehe, mit - ähm, sorry; Ich meine "Verwenden einer geeigneten Sprachfunktion" ;-p