17

これは、コードビハインドから行うのは非常に簡単です。

var button = new Button();
var margin = button.Margin;
margin.Right = 10;
button.Margin = margin;

ただし、XAMLでは、次の制限があります。

<Button Margin="0,0,10,0" />

これに伴う問題は、他のマージン値(つまり、左、上、下)をゼロに設定することで上書きする可能性があることです。

次のようなXAMLを使用する方法はありますか?

<Button MarginRight="10" />
4

4 に答える 4

17

添付プロパティを使用できます。実際、これはまさにアタッチされたプロパティの目的です。つまり、親要素のプロパティにアクセスしたり、特定の要素に機能を追加したりすることです。

たとえば、アプリケーションのどこかに次のクラスを定義します。

using System;
using System.Windows;
using System.Windows.Controls;

namespace YourApp.AttachedProperties
{
    public class MoreProps
    {
        public static readonly DependencyProperty MarginRightProperty = DependencyProperty.RegisterAttached(
            "MarginRight",
            typeof(string),
            typeof(MoreProps),
            new UIPropertyMetadata(OnMarginRightPropertyChanged));

        public static string GetMarginRight(FrameworkElement element)
        {
            return (string)element.GetValue(MarginRightProperty);
        }

        public static void SetMarginRight(FrameworkElement element, string value)
        {
            element.SetValue(MarginRightProperty, value);
        }

        private static void OnMarginRightPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            var element = obj as FrameworkElement;

            if (element != null)
            {
                int value;
                if (Int32.TryParse((string)args.NewValue, out value))
                {
                    var margin = element.Margin;
                    margin.Right = value;
                    element.Margin = margin;
                }
            }
        }
    }
}

XAMLで行う必要があるのは、次の名前空間を宣言することだけです。

xmlns:ap="clr-namespace:YourApp.AttachedProperties"

そして、次のようなXAMLを記述できます。

<Button ap:MoreProps.MarginRight="10" />



または、添付プロパティの使用を避け、代わりに次のような少し長いXAMLを作成することもできます。

<Button>
    <Button.Margin>
        <Thickness Right="10" />
    </Button.Margin>
</Button>

于 2012-09-28T00:42:32.850 に答える
1

マージンをMVVMのプロパティ(文字列)にデータバインドできます。MVVMで必要なのは、個々のプロパティ(上、右、下、右)を追跡することだけです。

次のようにコンバーターを使用できます。XAMLでのみトップマージンを設定するにはどうすればよいですか?またはWPFコントロールのmarginプロパティの一部のみをバインドする

于 2012-09-28T11:49:25.510 に答える
1

アタッチされたプロパティは機能しますが。コードビハインドでUIを変更しないように、コードをリファクタリングしようとします。ファイルのデザイン側でできる限り多くのUIを処理する必要があります。xamlファイルのコードビハインドはMVVMで問題が発生するため、できるだけ使用しないようにしています。

于 2012-09-28T04:11:30.040 に答える
0

あなたはこの部分で間違っています:

var button = new Button();
button.Margin.Right = 10;

エラーCS1612:変数ではないため、「System.Windows.FrameworkElement.Margin」の戻り値を変更できません

Marginは構造体を返し、したがって値型であるため、すでに有効なコードではありません。また、DependencyObjectから派生していないため、多くのDataBindingトリックも機能しません。

私は適切な説明をしたかっただけです、さもなければ私はあなたの最初の答えがほとんど唯一の方法であると言うでしょう。

于 2012-09-28T01:26:47.047 に答える