MyControl.Margin.Left = 10;
error:Configuración de las propiedades de margen en el código
Cannot modify the return value of 'System.Windows.FrameworkElement.Margin' because it is not a variable
MyControl.Margin.Left = 10;
error:Configuración de las propiedades de margen en el código
Cannot modify the return value of 'System.Windows.FrameworkElement.Margin' because it is not a variable
El problema es que Margin
es una propiedad y su tipo (Thickness
) es un tipo de valor. Eso significa que cuando acceda a la propiedad obtendrá una copia del valor devuelto.
A pesar de que puede cambiar el valor de la propiedad Thickness.Left
para un determinado valor (GRR ... no deberían existir tipos de valores mutables), que no cambiaría el margen.
En su lugar, deberá establecer la propiedad Margin
a un nuevo valor. Por ejemplo (casualmente el mismo código que Marc escribió):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Como nota para el diseño de la biblioteca, habría muy preferido que Thickness
eran inmutables, pero con métodos que devuelven un valor nuevo que era una copia de el original, pero con una parte reemplazada. Posteriormente, se podría escribir:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Sin preocuparse por el extraño comportamiento de los tipos de valor mutables, bonito y legibles, toda una expresión ...
Uno diría que (y mi WPF es un poco oxidado en este momento) que toma un objeto de margen y no se puede modificar directamente.
por ejemplo
MyControl.Margin = new Margin(10,0,0,0);
Esto no funciona: _'System.Windows.FrameworkElement.Margin 'es una' propiedad 'pero se usa como un 'type'_ –
Margin
está volviendo una estructura, lo que significa que se está editando una copia . Usted necesitará algo como:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
MyControl.Margin = margin; – TheMissingLINQ
(aplausos, arreglado hace algún tiempo ... supongo que necesitabas una actualización de página ;-p) –
Heh, si tuviéramos actualizaciones de comentarios de Ajax, así que no parecía una herramienta ... – TheMissingLINQ
La propiedad Margin
devuelve una estructura Thickness
, de los cuales Left
es una propiedad. Lo que hace la declaración es copiar el valor de la estructura de la propiedad Margin
y establecer el valor de la propiedad Left
en la copia. Obtiene un error porque el valor que estableció no se almacenará nuevamente en la propiedad Margin
.
(versiones anteriores de C# le acaba de dejar de hacerlo sin quejarse, causando una gran cantidad de preguntas en grupos de noticias y foros sobre por qué una afirmación como esa no tuvo ningún efecto en absoluto ...)
Para establecer la propiedad lo que se necesita para obtener la estructura Thickness
de la propiedad Margin
, ajustar el valor y almacenar de nuevo:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
Si se va a establecer todos los márgenes, basta con crear una estructura Thickness
y los puso a todos a la vez:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Gracias, buena. – MikeMalter
Para utilizar Thickness
necesita crear/cambiar su proyecto de plataforma de la versión .NET framework
a 4.5. porque este método solo está disponible en la versión 4.5. (También puedes descargar PresentationFramework.dll y dar referencia a este dll, sin crear/cambiar tu versión .NET framework
a 4.5.)
Pero si usted quiere hacer este sencillo, puede utilizar este código:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
también
MyControl.Margin = new Padding(int all);
Esto es simple y no hay necesidades de cualquier cambio en su proyecto
No está nada claro qué es lo que está preguntando, pero para hacer las cosas más cómodas, puede heredar su propio Control y agregar una propiedad con el código que Marc sugiere:
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 de cliente se puede escribir simplemente
MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
usando la herencia para resolver tal problema? Bastante grande, ¿no? – LuckyLikey
@LuckyLikey depende del caso de uso: si planea alterar el '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. –
Se podría utilizar simplemente esto
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
depende de la situación, también se puede tratar de usar propiedad padding aquí ...
MyControl.Margin=new Padding(0,0,0,0);
felicitaciones por buscar el tipo real ... Confieso hacer trampa con 'var' - ejem, lo siento; Me refiero a "utilizar una función de idioma apropiada" ;-p –
Me ayudó que el mensaje de error contuviera el nombre de tipo completo. Con un marcador rápido para MSDN, solo necesitaba "msdn System.Windows.FrameworkElement.Margin" en la barra de direcciones para ir a la página correcta ... –
coincidentemente ¿eh? ;) – zvolkov