86
MyControl.Margin.Left = 10;

エラー:

変数ではないため、'System.Windows.FrameworkElement.Margin' の戻り値を変更できません

4

9 に答える 9

144

問題は、それ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 つの式です...

于 2009-06-16T20:33:40.607 に答える
45

プロパティは、プロパティである構造体をMargin返します。ステートメントが行うことは、プロパティから構造値をコピーし、コピーにプロパティ値を設定することです。設定した値がプロパティに保存されないため、エラーが発生します。ThicknessLeftMarginLeftMargin

(以前のバージョンの C# では、文句を言わずに実行できたので、ニュースグループやフォーラムでは、なぜそのようなステートメントがまったく効果がないのかについて多くの質問が寄せられました...)

Thicknessプロパティを設定するには、プロパティから構造を取得する必要がありMargin、値を設定して元に戻します。

Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;

すべてのマージンを設定する場合は、Thickness構造を作成して一度に設定します。

MyControl.Margin = new Thickness(10, 10, 10, 10);
于 2009-06-16T20:32:21.467 に答える
14

単純にこれを使用できます

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
于 2015-04-22T08:41:59.830 に答える
14

Margin構造体を返しています。これは、コピーを編集していることを意味します。次のようなものが必要になります。

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
于 2009-06-16T20:30:20.380 に答える
4

Margin はオブジェクトを受け取り、直接変更することはできないと推測できます (そして、私の WPF は現在少し錆びています)。

例えば

MyControl.Margin = new Margin(10,0,0,0);
于 2009-06-16T20:29:34.017 に答える
4

使用するには、プロジェクトプラットフォームのバージョンを 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);

これは簡単で、プロジェクトを変更する必要はありません

于 2014-02-25T13:27:01.133 に答える
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
于 2014-07-03T09:39:57.230 に答える