- - PR -
プロパティ値がInitializeComponentに自動生成される件
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-20 16:52
こんにちわ。
ボタンを継承させたカスタムボタンを作成しました。 何がカスタムかというと、ボタンのBackColorやFontを外部XML定義ファイルから 読み込んで設定する機能が付加されています。 下記ソースでBackColorプロパティとFontプロパティは、 カスタムボタンを使用するクラスの InitializeComponentに記述されることも無くうまく実装できました。 しかし、Sizeプロパティはオーバーライド不可の為、同じように実装できませんでした。 ポイントとしては、外部XML定義ファイルは随時更新されるものなので、 カスタムボタンクラスのコンストラクタで安易にSizeプロパティをセットしてしまうと カスタムボタンを使用するクラスのInitializeComponent()に値が自動生成されて 変更ができなくなってしまう点です。 何か回避策がございましたらご教授お願いします。 =========================================================================== public class CustomButton : System.Windows.Forms.Button { // メンバ変数 private XMLFileReader xmlReader; // コンストラクタ public CustomButton() { xmlReader = new XMLFileReader(); } // BackColorプロパティのオーバーライド public override System.Drawing.Color BackColor { get { return XMLFileReader.BackColor; } } // Fontプロパティのオーバーライド public override System.Drawing.Font Font { get { return XMLFileReader.Font; } } // ↑ここまでは成功 // ↓これはできない(Sizeプロパティはoverrride不可な為) // Fontプロパティのオーバーライド public override System.Drawing.Size Size { get { return XMLFileReader.Size; } } } ======================================================================== 参考にしたサイト http://www.microsoft.com/japan/msdn/net/general/custcodegen.asp#custcodegen_topic6 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14796&forum=7 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30051&forum=7&7 (前スレッド) | ||||||||
|
投稿日時: 2006-04-20 17:00
C# では new キーワード、VB では Shadows キーワードで、 Setter を無視、DefaultValue を修飾することでできませんか? 根本的な解決にはならないかもしれませんが。
XML からの変更以外は受け付けなくしたい、ということでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-04-20 17:11
>XML からの変更以外は受け付けなくしたい、ということでしょうか? 現在その方向で考えています。 ですのでSetもできないようにしています。 そもそもボタンのカプセル化は無理があったのでしょうか、、、 | ||||||||
|
投稿日時: 2006-04-20 17:17
変更不可自体は先のように Setter を無効化すれば見た目上は可能だと思います。 プロパティが見えてしまうことに違和感があるならば、属性を使ってインテリセンス上からなら消せます。 が、そこまで制限する必要があるようには思えません... 方向性としては「読み込ませる機能まで内包する」ということでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-04-20 17:34
ジャンヌメット様、度々ご返答ありがとうございます。
>変更不可自体は先のように Setter を無効化すれば見た目上は可能だと思います。 はい。変更不可に関してはこれで十分要求は満たされています。 >方向性としては「読み込ませる機能まで内包する」ということでしょうか? どちらかというとこちらの方が重要でして、 overrideできないプロパティもXMLから取得したデータを設定したいのです。 「できたらいいな」順だと 1、overrideできないものを裏技でoverrideしてしまう 2、カスタムボタンクラス呼び出し元のInitializeComponentに記述されないイベント内でSizeプロパティを設定する 3、Sizeに関してはxml定義をあきらめて、サイズパターン分カスタムボタンを作る | ||||||||
|
投稿日時: 2006-04-20 18:02
プロパティをシャドウして、これくらいしか思いつきません。 DefaultValue 属性は決め打ちでないとできませんから... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-04-20 18:04
というより、継承ではなく自作コントロールの方が良いでしょう。
異質なものを求めるのであれば、妥当と言えます。 が、いずれにしても、個人的にはお勧めできません... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-04-20 18:21
>というより、継承ではなく自作コントロールの方が良いでしょう。
>異質なものを求めるのであれば、妥当と言えます。 >が、いずれにしても、個人的にはお勧めできません... 確かにそうですね。別の道も検討してみます。 本来のボタンクラスの機能を大幅に制限することにもなりますし。 今回は、 1、全ての画面リソースのプロパティはxmlファイルで一括管理 2、画面リソース作成者は一切のプロパティ変更を禁止 3、画面リソース作成者はノンプログラミングで実装 という要求があったので、少々ここに無理があったのかもしれません。 |