MyControl.Margin.Left = 10;
Error:
No se puede modificar el valor de retorno de 'System.Windows.FrameworkElement.Margin' porque no es una variable
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 ...
var
- ejem, lo siento; Me refiero a "usar una función de lenguaje adecuada" ;-pLa
Margin
propiedad devuelve unaThickness
estructura, de la cualLeft
es una propiedad. Lo que hace la declaración es copiar el valor de la estructura de laMargin
propiedad y establecer el valor de laLeft
propiedad en la copia. Obtiene un error porque el valor que estableció no se almacenará nuevamente en laMargin
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 laMargin
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);
fuente
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;
fuente
Uno podría simplemente usar esto
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
fuente
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);
fuente
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.
fuente
Depende de la situación, también puede intentar usar la propiedad de relleno aquí ...
MyControl.Margin=new Padding(0,0,0,0);
fuente
Margen = nuevo Espesor (0, 0, 0, 0);
fuente
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
fuente
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.