MyControl.Margin.Left = 10;
エラー:
'System.Windows.FrameworkElement.Margin'の戻り値は変数ではないため、変更できません
回答:
問題は、それMargin
がプロパティであり、その型(Thickness
)が値型であるということです。つまり、プロパティにアクセスすると、コピーが取得されますと、値のが返されます。
特定の値のプロパティの値を変更できますがThickness.Left
(grr ...可変値タイプは存在しないはずです)、マージンは変更されません。
代わりに、Margin
プロパティを新しい値に設定する必要があります。たとえば(偶然にもマークが書いたのと同じコード):
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);
Margin
は構造体を返します。これは、コピーを編集していることを意味します。次のようなものが必要になります。
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
これを簡単に使用できます
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
マージンはオブジェクトを取得し、直接変更できないと推測されます(そして、私の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);
これは簡単で、プロジェクトに変更を加える必要はありません
何を求めているのかは少しわかりませんが、快適にするために、独自の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
MerginLeft
ます。プロジェクトの複数の場所でを変更する場合は、継承によって設計上の問題を回避できます。もちろん、これがあなたのプロジェクトの単一の場所である場合、私は受け入れられた答えを選びます。
var
-ええと、ごめんなさい。「適切な言語機能を使用する」という意味です;-p