2009-06-16 7 views

Respuesta

108

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 ...

+3

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 –

+1

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 ... –

+0

coincidentemente ¿eh? ;) – zvolkov

5

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); 
+0

Esto no funciona: _'System.Windows.FrameworkElement.Margin 'es una' propiedad 'pero se usa como un 'type'_ –

13

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; 
+0

MyControl.Margin = margin; – TheMissingLINQ

+0

(aplausos, arreglado hace algún tiempo ... supongo que necesitabas una actualización de página ;-p) –

+1

Heh, si tuviéramos actualizaciones de comentarios de Ajax, así que no parecía una herramienta ... – TheMissingLINQ

29

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); 
+0

Gracias, buena. – MikeMalter

4

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

0

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 
+0

usando la herencia para resolver tal problema? Bastante grande, ¿no? – LuckyLikey

+0

@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. –

10

Se podría utilizar simplemente esto

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0); 
2

depende de la situación, también se puede tratar de usar propiedad padding aquí ...

MyControl.Margin=new Padding(0,0,0,0); 
Cuestiones relacionadas