84 votes

Réglage de la Marge de Propriétés dans le code

MyControl.Margin.Left = 10;

Erreur:

Impossible de modifier la valeur de retour de 'Système.De Windows.FrameworkElement.Marge car il n'est pas une variable

141voto

Jon Skeet Points 692016

Le problème est qu' Margin est une propriété et son type (Thickness) est un type de valeur. Cela signifie que lorsque vous accédez à la propriété, vous obtenez une copie de la valeur de retour.

Même si vous pouvez modifier la valeur de l' Thickness.Left des biens pour une valeur particulière (grr... mutable types de valeur ne devrait pas exister), il ne serait pas changer la marge.

Au lieu de cela, vous aurez besoin de mettre de l' Margin de la propriété à une nouvelle valeur. Par exemple (par coïncidence, le même code que Marc a écrit):

Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

Comme une note pour la conception d'une bibliothèque, j'aurais largement préféré qu' Thickness étaient immuables, mais avec des méthodes qui ont renvoyé une nouvelle valeur qui est une copie de l'original, mais avec une partie remplacé. Ensuite, vous pouvez écrire:

MyControl.Margin = MyControl.Margin.WithLeft(10);

Sans se soucier de comportement étrange de mutable types de valeur, agréable et lisible, tous d'une expression...

44voto

Guffa Points 308133

L' Margin propriété renvoie un Thickness de la structure, dont Left est une propriété. Ce que la déclaration n'est la copie de la valeur de la structure de l' Margin propriété et le réglage de la Left de la valeur de propriété sur la copie. Vous obtenez une erreur parce que la valeur que vous définissez ne sera pas stocké dans l' Margin de la propriété.

(Les versions antérieures de C# voudrais juste vous laisser faire cela, sans se plaindre, causant beaucoup de questions dans les forums de discussion et des forums sur le pourquoi d'une telle déclaration n'a eu aucun effet du tout...)

Pour définir la propriété, vous devrez obtenir l' Thickness structure en Margin de la propriété, définissez la valeur et le stocker à l'arrière:

Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;

Si vous voulez toutes les marges, il suffit de créer un Thickness de la structure et de les mettre tous à la fois:

MyControl.Margin = new Thickness(10, 10, 10, 10);

14voto

Marc Gravell Points 482669

Margin est de retour d'une struct, ce qui signifie que vous modifiez une copie. Vous aurez besoin de quelque chose comme:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

4voto

Ash Points 2002

On suppose que (et mon WPF est un peu rouillé en ce moment) que la Marge prend un objet et ne peuvent pas être modifiées directement.

e.g

MyControl.Margin = new Margin(10,0,0,0);

4voto

Daler Tursunov Points 11

Pour utiliser Thickness vous avez besoin pour créer et/ou modifier votre projet .NET framework version de plate-forme à 4.5. tenir à cette méthode uniquement disponible dans la version 4.5. (Vous pouvez aussi tout simplement télécharger PresentationFramework.dll et donner referense à cette dll, sans créer/modifier votre .NET framework version 4.5.)

Mais si vous voulez faire simple, Vous pouvez utiliser ce code:

MyControl.Margin = new Padding(int left, int top, int right, int bottom);

aussi

MyControl.Margin = new Padding(int all);

C'est simple et pas besoin de tout changement à votre projet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X