質問
MyControl.Margin.Left = 10;
エラー:
変数ではないため、 'System.Windows.FrameworkElement.Margin'の戻り値を変更できません
解決
問題は、 Margin
はプロパティであり、そのタイプ( < code> Thickness )は値型です。つまり、プロパティにアクセスすると、値のコピーが返されます。
Thickness.Left
プロパティ(grr ...可変値タイプは存在しないはずです)、マージンは変更されません。
代わりに、 Margin
プロパティを新しい値に設定する必要があります。例えば(偶然にもMarcが書いたのと同じコード):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
ライブラリ設計のメモとして、 Thickness
が不変であるが、元のコピーであるが一部が置換された新しい値を返すメソッドを使用する場合、私はそれを非常に好むでしょう。その後、次のように書くことができます:
MyControl.Margin = MyControl.Margin.WithLeft(10);
変更可能な値型の奇妙な動作については心配しません。見やすく読みやすい、すべて1つの式...
他のヒント
Margin
プロパティは、 Left
がプロパティである Thickness
構造を返します。このステートメントは、 Margin
プロパティから構造値をコピーし、そのコピーに Left
プロパティ値を設定します。設定した値は Margin
プロパティに保存されないため、エラーが発生します。
(以前のバージョンのC#では、文句を言わずにそれを行うことができたため、ニュースグループやフォーラムで、そのような声明がまったく効果がなかった理由について多くの質問を引き起こしています...)
プロパティを設定するには、 Margin
プロパティから Thickness
構造を取得し、値を設定して保存する必要があります。
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
すべてのマージンを設定する場合は、 Thickness
構造を作成して、一度にすべて設定します。
MyControl.Margin = new Thickness(10, 10, 10, 10);
Margin
は構造体を返しています。つまり、コピーを編集しています。次のようなものが必要になります:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
単純にこれを使用できます
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Marginはオブジェクトを取得し、直接変更できないことを推測します(そして、私のWPFは今少し錆びています)。
e.g
MyControl.Margin = new Margin(10,0,0,0);
Thickness
を使用するには、プロジェクトの .NET framework
プラットフォームバージョンを4.5に作成/変更する必要があります。このメソッドはバージョン4.5でのみ使用できるためです。 (また、 .NET framework
のバージョンを4.5に作成/変更せずに、PresentationFramework.dllをダウンロードしてこのDLLに参照を与えることもできます。)
しかし、これを簡単にしたい場合は、次のコードを使用できます:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
また
MyControl.Margin = new Padding(int all);
これは簡単で、プロジェクトを変更する必要はありません
状況によっては、ここでpaddingプロパティを使用してみることもできます...
MyControl.Margin=new Padding(0,0,0,0);
Margin = new Thickness(0、0、0、0);
何を尋ねているのか少しわかりませんが、物事を快適にするために、独自の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