コードでマージンプロパティを設定する


82
MyControl.Margin.Left = 10;

エラー:

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

回答:


138

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

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

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

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

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

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

可変値型の奇妙な振る舞い、素晴らしくて読みやすい、すべて1つの式について心配する必要はありません...


3
実際のタイプを調べてくれたことを称賛します...私は浮気を告白しますvar-ええと、ごめんなさい。「適切な言語機能を使用する」という意味です;-p
MarcGravell

1
エラーメッセージに完全修飾型名が含まれていることがわかりました。右ページに取得するアドレスバー...上のMSDN、私だけで必要な「MSDN System.Windows.FrameworkElement.Margin」のための迅速なしおり付き
ジョンスキート

マーク、zvolkovは私たちの秘密を発見しました!1日に200を取得するのは簡単すぎることがわかったので、もっと挑戦して、上位2人のユーザーを獲得しようと思いました。モデレーターとして「マーク」を取得することは単なるボーナスでした...;)
Jon Skeet

しかし、私たちの他の人はどうですか?私のことですか?彼らは「軍団」の台本についてもう知っていますか?
MarcGravell

あなたたちが陽気だと付け加えてもいいですか?StackOverflowなどの外部で一緒に作業していますか?あなたはみんなとてもおしゃべりです-それは私を部外者のように感じさせます、ハハ。
Giffyguy 2009年

41

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

13

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

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

(乾杯、少し前に修正されました...ページの更新が必要だったと思います; -p)
MarcGravell

11

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

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

4

マージンはオブジェクトを取得し、直接変更できないと推測されます(そして、私のWPFは現在少し錆びています)。

例えば

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

これは機能しません:「System.Windows.FrameworkElement.Margin」は「プロパティ」ですが、「タイプ」のように使用されます
Tor Klingberg 2016

4

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

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


3

状況に応じて、ここでパディングプロパティを使用することもできます...

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

2

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


あなたのコードについてのより多くの説明がいいでしょう。コードの投稿はご遠慮ください。
Jackyef 2018年

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

そのような問題を解決するために継承を使用していますか?かなり大きなオーバーヘッドですね。
LuckyLikey 2017年

@LuckyLikeyユースケースによって異なりMerginLeftます。プロジェクトの複数の場所でを変更する場合は、継承によって設計上の問題を回避できます。もちろん、これがあなたのプロジェクトの単一の場所である場合、私は受け入れられた答えを選びます。
ヤンTuroň
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.