10

WPFデザインの基本について何かが足りないかもしれませんが、なぜWPFコントロールの多くのプロパティがタイプ「オブジェクト」として公開されているのか疑問に思いました。

たとえば、MenuItem.Iconはオブジェクトであり、MenuItem.ToolTipも同様です。初めてのユーザーとして、これは私にとって非常に混乱していました(ToolTipをString型に設定しても機能するかどうかわからない、動的プログラミング言語を使用しているように感じました)。さらに、アイコンを「System.Drawing.Icon」に設定しようとすると、「引数「画像」はアイコンとして使用できる画像である必要があります」というArgumentExceptionが発生します。少なくとも世界であなたがそれを与えることになっているものを説明できるように、プロパティを入力するべきではありませんか?

正直なところ、理由についての私の推測は、(ラッパーを作成せずに)作成しなかった型にインターフェースを実装できないためですが、それは単なる推測です。

あなたの答えと洞察に感謝します!

4

3 に答える 3

2

私の意見の主な理由は、オブジェクトは「.NetFrameworkのすべてのクラスの最終的な基本クラス」であるためです。これにより柔軟性が得られます。WPFでは、事前定義されたタイプに制限されません。Wpfは異なり、学習曲線がありますが、見栄えのする製品を作成するためのより多くのオプションが提供されます。

すなわち

テキストボックスをツールチップに割り当てることができます。

TextBox tb = new TextBox();
tb.Text = "Hello World";
this.ToolTip = tb;

ビットマップ

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg")));
Image image = new Image();
image.Source = myBitmapImage;
this.ToolTip = image;

MenuItemに画像を割り当てます

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg")));
Image image = new Image();
image.Source = myBitmapImage;
menuItem1.Icon = image;
于 2012-06-17T03:32:33.700 に答える
1

ToolTipたとえばを考えてみましょう。ツールチップはContentControlであり、任意のタイプのCLR(共通言語ランタイム)オブジェクト(文字列やDateTimeオブジェクトなど)またはUIElementオブジェクト(RectangleやPanelなど)を含めることができます。これにより、ButtonやCheckBoxなどのコントロールにリッチコンテンツを追加できます。

このため、などの要素は、タイプ階層のルートであるToolTipとして公開されObjectます(その結果、使いやすさ、柔軟性、およびコードの明確さが得られます)。

于 2012-06-17T10:16:22.893 に答える
0

これらのプロパティがUIElements(または他のWPF固有のオブジェクト)として入力されたと想像してください。UIElementsではないオブジェクトをコントロールにどのように追加しますか?

必要な情報を公開するWPFオブジェクトから派生したラッパーを提供する必要があります。ほとんどの場合、ラッパーはラップされるオブジェクトのToString()を呼び出すだけです。使用するほとんどの型がToString()の十分なデフォルト実装を提供するので、開発者にすべてのラッパーを作成させるのではなく、これを呼び出すのが理にかなっています。

次に、それらが何らかのインターフェースとして入力されたかどうかを想像してください。このインターフェースではできないことを伝えたい場合はどうしますか?唯一のオプションは、(a)開発者がフレームワークの制限に耐えているか、(b)Microsoftがインターフェイスを更新し、すでに作成されている既存のコードをすべて破棄することです。

また、MVVMのようなパターンを使用しているかどうかも検討してください。現在の設計では、ビューモデルで、WPFに関連付けられていないプロパティを公開できるため、最終的には、さまざまなテクノロジ間でコードをより再利用できるようになります。

最後に、プロパティを表すオブジェクトと、WPFがその情報をレンダリングする方法には違いがあることを忘れないでください。たとえば、 System.Stringなどのプリミティブ型を使用する場合、WPFはテキストブロックを作成し、textプロパティをToString()の結果に設定します。これにより、UIによって表示されるデータと、UIによって情報がレンダリングされる方法を非常に明確に分離できます。

たとえば、メニュー項目を表す単純なクラスを考えてみましょう。

public class MenuItem
{
    public string Text { get; set; }
    public bool IsChecked { get; set; }
    public bool IsEnabled { get; set; }
}

このタイプは、メニュー項目に関するデータのみを公開し、この情報のレンダリング方法に関する情報はありません。実際、クラスの名前(MenuItem)を除けば、これはメニュー項目に固有のものではなく、変更を必要とせずに、チェックされたリストボックスなどの別のUIコントロールで同じデータを使用できます。クラスがWPF固有のユーザーインターフェイス要素を公開している場合、情報は、異なるユーザーインターフェイスコントロールごとに別のタイプで調整する必要があります。

于 2012-06-17T11:25:18.663 に答える