web-dev-qa-db-fra.com

Définition des propriétés de la marge dans le code

MyControl.Margin.Left = 10;

Erreur:

Impossible de modifier la valeur de retour de 'System.Windows.FrameworkElement.Margin' car ce n'est pas une variable

68
Giffyguy

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

Même si vous pouvez modifier la valeur de la propriété Thickness.Left pour une valeur particulière (les types de valeurs mutables ne devraient pas exister), cela ne modifierait pas la marge.

Au lieu de cela, vous devrez définir la propriété Margin sur une nouvelle valeur. Par exemple (coïncidence, le même code que Marc a écrit):

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

Pour la conception des bibliothèques, j'aurais beaucoup préféré si Thickness était immuable, mais avec des méthodes renvoyant une nouvelle valeur qui était une copie de l'original, mais dont une partie avait été remplacée. Ensuite, vous pourriez écrire:

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

Ne vous inquiétez pas du comportement étrange des types de valeurs modifiables, agréable et lisible, expression unique ...

120
Jon Skeet

La propriété Margin renvoie une structure Thickness, dont Left est une propriété. L'instruction copie la valeur de structure de la propriété Margin et définit la valeur de la propriété Left sur la copie. Vous obtenez une erreur car la valeur que vous définissez ne sera pas stockée dans la propriété Margin.

(Les versions précédentes de C # vous permettraient simplement de le faire sans vous plaindre, ce qui causait beaucoup de questions dans les groupes de discussion et les forums sur les raisons pour lesquelles une telle déclaration n'avait aucun effet ...)

Pour définir la propriété dont vous auriez besoin pour obtenir la structure Thickness à partir de la propriété Margin, définissez la valeur et enregistrez-la en arrière:

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

Si vous souhaitez définir toutes les marges, créez simplement une structure Thickness et définissez-les toutes en même temps:

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

Margin renvoie une structure, ce qui signifie que vous éditez un fichier copy. Vous aurez besoin de quelque chose comme:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
13
Marc Gravell

On pourrait simplement utiliser cette

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

On devinerait que (et mon WPF est un peu rouillé en ce moment) que Margin prend un objet et ne peut pas être changé directement.

par exemple 

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

Pour utiliser Thickness, vous devez créer/modifier la version de votre projet .NET framework en 4.5. parce que cette méthode est disponible uniquement dans la version 4.5. (Vous pouvez également télécharger PresentationFramework.dll et donner référense à cette dll, sans créer/modifier votre version .NET framework en 4.5.) 

Mais si vous voulez faire cela simplement, vous pouvez utiliser ce code:

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

également 

MyControl.Margin = new Padding(int all);

C'est simple et aucune modification de votre projet n'est nécessaire

4
Daler Tursunov

Dépend de la situation, vous pouvez également utiliser la propriété padding ici ...

MyControl.Margin=new Padding(0,0,0,0);
2
Rishi

Marge = nouvelle épaisseur (0, 0, 0, 0);

1
KalleP

Vous demandez un peu ce que vous demandez, mais pour rendre les choses plus confortables, vous pouvez hériter de votre propre contrôle et ajouter une propriété avec le code suggéré par Marc:

class MyImage : Image {
    private Thickness thickness;
    public double MarginLeft {
        get { return Margin.Left; }
        set { thickness = Margin; thickness.Left = value; Margin = thickness; }
    }
}

Ensuite, dans le code client, vous pouvez écrire juste

MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
0
Jan Turoň