MyControl.Margin.Left = 10;
Error:
No se puede modificar el valor de retorno de 'System.Windows.FrameworkElement.Margin' porque no es una variable
Respuestas:
El problema es que Margin
es una propiedad y su tipo ( Thickness
) es un tipo de valor. Eso significa que cuando accede a la propiedad, obtiene una copia del valor.
Aunque puede cambiar el valor de la Thickness.Left
propiedad para un valor particular (grr ... los tipos de valores mutables no deberían existir), no cambiaría el margen.
En su lugar, deberá establecer la Margin
propiedad en un nuevo valor. Por ejemplo (casualmente el mismo código que escribió Marc):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Como nota para el diseño de la biblioteca, lo hubiera preferido mucho si Thickness
fuera inmutable, pero con métodos que devolvían un nuevo valor que era una copia del original, pero con una parte reemplazada. Entonces podrías escribir:
MyControl.Margin = MyControl.Margin.WithLeft(10);
No se preocupe por el comportamiento extraño de los tipos de valores mutables, agradable y legible, todo una expresión ...
La Margin
propiedad devuelve una Thickness
estructura, de la cual Left
es una propiedad. Lo que hace la declaración es copiar el valor de la estructura de la Margin
propiedad y establecer el valor de la Left
propiedad en la copia. Obtiene un error porque el valor que estableció no se almacenará nuevamente en la Margin
propiedad.
(Las versiones anteriores de C # simplemente le permitían hacerlo sin quejarse, lo que generaba muchas preguntas en los grupos de noticias y foros sobre por qué una declaración como esa no tenía ningún efecto ...)
Para establecer la propiedad, necesitaría obtener la Thickness
estructura de la Margin
propiedad, establecer el valor y almacenarlo nuevamente:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
Si va a establecer todos los márgenes, simplemente cree una Thickness
estructura y configúrelos todos a la vez:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Margin
devuelve una estructura, lo que significa que está editando una copia . Necesitará algo como:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Uno podría simplemente usar esto
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Uno diría que (y mi WPF está un poco oxidado en este momento) que Margin toma un objeto y no se puede cambiar directamente.
p.ej
MyControl.Margin = new Margin(10,0,0,0);
Para usarlo Thickness
, debe crear / cambiar la .NET framework
versión de la plataforma de su proyecto a 4.5. porque este método está disponible solo en la versión 4.5. (También puede descargar PresentationFramework.dll y dar referencia a este dll, sin crear / cambiar su .NET framework
versión a 4.5).
Pero si quieres hacer esto simple, puedes usar este código:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
además
MyControl.Margin = new Padding(int all);
Esto es simple y no necesita cambios en su proyecto.
No está claro qué estás preguntando, pero para hacer las cosas cómodas, puedes heredar tu propio Control y agregar una propiedad con el código que sugiere Marc:
class MyImage : Image {
private Thickness thickness;
public double MarginLeft {
get { return Margin.Left; }
set { thickness = Margin; thickness.Left = value; Margin = thickness; }
}
}
Luego, en el código del cliente, puede escribir solo
MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
MerginLeft
en varios lugares del proyecto, la herencia evita problemas de diseño. Por supuesto, si este es un lugar único en su proyecto, elegiría la respuesta aceptada.
var
- ejem, lo siento; Me refiero a "usar una función de lenguaje adecuada" ;-p