15

最近、WPF が XAML でさまざまな測定単位をサポートしていることを発見しました。デフォルトの DIP に加えて、ピクセル、インチ、センチメートルもサポートされています (私の知る限り)。これにより、デザイナーは次のような XAML を記述できます。

<Canvas>
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/>
</Canvas>

ただし、これらの値をバインドすることはできません。たとえば、「7cm」などの文字列である Dimension プロパティを持つ ViewModel があるとします。以下は機能しません:

<Button Width="{Binding Dimension}">Test</Button>

FormatException がスローされます。同様に、FrameworkElementコード ビハインドで を作成する場合は、次のようになります。

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"});

コンストラクター/コントロールを作成しようとする場所で例外がスローされるため、コンパイルは失敗します。

私は疑問に思う:

  • コード ビハインドで自然単位 (私の場合はメートル - センチメートル) を使用することは可能ですか?
  • どのように?
  • WPF/XAML がサポートするユニットの完全なリストはありますか?

編集:

この質問を解決する以下のコメントからのリンクを次に示します。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

4

2 に答える 2

17

XAML パーサーが使用するのと同じ変換を適用することで、コード ビハインドでこれを行うことができます。文字列の受け渡しを気にしない場合は、このロジックを再実装する必要はありません。

button.Width = (double)new LengthConverter().ConvertFrom("2cm");

XAML パーサーは、TypeConvertersを使用して文字列を必要な値に変換します。プロパティのドキュメント ページで、WidthTypeConverterAttribute a を使用する必要があることが指定されていることがわかりますLengthConverter。この属性は、プロパティの処理方法をローカルでオーバーライドするために使用できますが、クラス レベルで適用することもできます。そのため、Employeeクラスに を使用する必要があることを指定するこの属性がEmployeeConverterある場合、 type のプロパティのデフォルトは上記のコンバーターになりますEmployee

バインディングがこの型コンバーターを適用しないことに少し驚いていますが、 内で使用するのIValueConverter十分に簡単です。IValueConverter

于 2012-03-01T00:18:26.527 に答える
2

1)および2)の場合、DIPはデバイスに依存しないため、問題なく、またはからの「自然単位」を計算できます。例外は(不自然な:)デバイスに依存するピクセルです。

文字列の値をdoubleに変換するValueConverterを作成します。ここで、目的の単位を文字列で指定できます。次に、バインディングでValueConverterを使用し、ViewModelで「自然単位」で計算できます。

3)と実装の場合:私はすぐにグーグルで何も見つかりませんでしたが、より深い検索で何かが表示される可能性があります。そうでなければ、独自のコンバーターを作成することはそれほど難しいことではありません。ここにいくつかの変換情報があります:

96DIP == 1inch == 2.54cm;
1cm == 37.8DIP;
1zoll == 1inch == 2.54cm;
于 2012-02-29T18:43:00.130 に答える