MyControl.Margin.Left = 10;
エラー:
'System.Windows.FrameworkElement.Margin'の戻り値は変数ではないため変更できません
問題は、 Margin
がプロパティであり、そのタイプ( Thickness
)が値タイプであるということです。つまり、プロパティにアクセスすると、値のcopyが返されます。
canが Thickness.Left
特定の値のプロパティ(grr ...可変値タイプは存在しないはずです)、マージンは変更されません。
代わりに、Margin
プロパティを新しい値に設定する必要があります。例えば(偶然にもMarcが書いたのと同じコード):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
ライブラリ設計のメモとして、Thickness
が不変であるが、元のコピーであるが一部が置換された新しい値を返すメソッドを使用する場合、それを非常に好むでしょう。次に、あなたは書くことができます:
MyControl.Margin = MyControl.Margin.WithLeft(10);
可変値型の奇妙な振る舞いについて心配する必要はありません.
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);
Margin
は構造体を返しています。これは、copyを編集していることを意味します。次のようなものが必要になります。
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
これを単純に使用できます
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Marginがオブジェクトを取得し、直接変更できないことを推測します(そして、私のWPFは今少し錆びています)。
例えば
MyControl.Margin = new Margin(10,0,0,0);
Thickness
を使用するには、プロジェクトを作成/変更する必要があります.NET framework
プラットフォームバージョン4.5。このメソッドはバージョン4.5でのみ利用可能であるためです。 (また、作成/変更せずにPresentationFramework.dllをダウンロードしてこのdllに参照を与えることができます.NET framework
バージョン4.5へ。
ただし、これを簡単に行うには、次のコードを使用できます。
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);
マージン=新しい厚さ(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