MyControl.Margin.Left = 10;
エラー:
変数ではないため、'System.Windows.FrameworkElement.Margin' の戻り値を変更できません
問題は、それMargin
がプロパティであり、その型 ( Thickness
) が値型であることです。つまり、プロパティにアクセスすると、値のコピーが返されます。
特定の値のプロパティの値を変更することはできますがThickness.Left
(grr... 変更可能な値の型は存在しないはずです)、マージンは変更されません。
Margin
代わりに、プロパティを新しい値に設定する必要があります。たとえば (偶然にも、Mar が書いたのと同じコード):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Thickness
ライブラリ設計のメモとして、不変であるが、元のコピーである新しい値を返すメソッドを使用するが、一部が置き換えられている場合、私はそれを非常に好みました。次に、次のように記述できます。
MyControl.Margin = MyControl.Margin.WithLeft(10);
変更可能な値型の奇妙な動作について心配する必要はありません。読みやすく、すべてが 1 つの式です...
プロパティは、プロパティである構造体をMargin
返します。ステートメントが行うことは、プロパティから構造値をコピーし、コピーにプロパティ値を設定することです。設定した値がプロパティに保存されないため、エラーが発生します。Thickness
Left
Margin
Left
Margin
(以前のバージョンの C# では、文句を言わずに実行できたので、ニュースグループやフォーラムでは、なぜそのようなステートメントがまったく効果がないのかについて多くの質問が寄せられました...)
Thickness
プロパティを設定するには、プロパティから構造を取得する必要がありMargin
、値を設定して元に戻します。
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
すべてのマージンを設定する場合は、Thickness
構造を作成して一度に設定します。
MyControl.Margin = new Thickness(10, 10, 10, 10);
単純にこれを使用できます
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Margin
構造体を返しています。これは、コピーを編集していることを意味します。次のようなものが必要になります。
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Margin はオブジェクトを受け取り、直接変更することはできないと推測できます (そして、私の WPF は現在少し錆びています)。
例えば
MyControl.Margin = new Margin(10,0,0,0);
使用するには、プロジェクトプラットフォームのバージョンを 4.5Thickness
に作成/変更する必要があります。.NET framework
このメソッドはバージョン 4.5 でのみ使用できるためです。.NET framework
(また、PresentationFramework.dll をダウンロードして、バージョンを 4.5に作成/変更せずに、この dll を参照することもできます。)
しかし、これを簡単にしたい場合は、次のコードを使用できます。
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
また
MyControl.Margin = new Padding(int all);
これは簡単で、プロジェクトを変更する必要はありません
何を求めているのかは少し不明ですが、快適にするために、独自の Control を継承し、Marc が提案するコードでプロパティを追加できます。
class MyImage : Image {
private Thickness thickness;
public double MarginLeft {
get { return Margin.Left; }
set { thickness = Margin; thickness.Left = value; Margin = thickness; }
}
}
次に、クライアントコードで次のように記述できます
MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft