web-dev-qa-db-ja.com

コードでのマージンプロパティの設定

MyControl.Margin.Left = 10;

エラー:

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

71
Giffyguy

問題は、 Margin がプロパティであり、そのタイプ( Thickness )が値タイプであるということです。つまり、プロパティにアクセスすると、値のcopyが返されます。

canThickness.Left 特定の値のプロパティ(grr ...可変値タイプは存在しないはずです)、マージンは変更されません。

代わりに、Marginプロパティを新しい値に設定する必要があります。例えば(偶然にもMarcが書いたのと同じコード):

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

ライブラリ設計のメモとして、Thicknessが不変であるが、元のコピーであるが一部が置換された新しい値を返すメソッドを使用する場合、それを非常に好むでしょう。次に、あなたは書くことができます:

MyControl.Margin = MyControl.Margin.WithLeft(10);

可変値型の奇妙な振る舞いについて心配する必要はありません.

123
Jon Skeet

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);
35
Guffa

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

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
13
Marc Gravell

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

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
11
LuckyLikey

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

例えば

MyControl.Margin = new Margin(10,0,0,0);
5
Ash

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);

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

4
Daler Tursunov

状況によっては、ここでpaddingプロパティを使用することもできます...

MyControl.Margin=new Padding(0,0,0,0);
3
Rishi

マージン=新しい厚さ(0、0、0、0);

2
KalleP

あなたが何を求めているのか少しわかりませんが、物事を快適にするために、独自の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
0
Jan Turoň