MyControl.Margin.Left = 10;
Erreur:
Impossible de modifier la valeur de retour de 'System.Windows.FrameworkElement.Margin' car ce n'est pas une variable
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 ...
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);
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;
On pourrait simplement utiliser cette
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
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);
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
Dépend de la situation, vous pouvez également utiliser la propriété padding ici ...
MyControl.Margin=new Padding(0,0,0,0);
Marge = nouvelle épaisseur (0, 0, 0, 0);
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