現在、コンテキストメニュー内にUserControlを表示するアプリケーションを開発中です。私は(これはToolStripControlHostを使用していくらか達成できました)。以下に示す(NumericUpDownToolStripItem code):以下はオブジェクトのコードです(VC++ .net 2.0で書かれています)。注:これに半類似のSOの質問がありますが、usercontrolsの標準オブジェクトだけをシリアル化するユーザーコントロールを扱うものはありません。UserControlデザイナーをホストするToolStripControlHostシリアライズは発生しません。
オブジェクトの後には、実際のusercontrol(ラベルを持つusercontrol)とnumericupdownコントロールのコードが表示されます。
問題:私のアプリケーションのデザイナを読み込むときにNumericUpDownToolStripItemをうまく追加することができますが、公開したプロパティを開いて私のusercontrolを編集すると、そのデータはInitializeComponentメソッドにはシリアル化されません私のNumericUpDownToolStripItemオブジェクトの。この効果は、実行時にすべてのデフォルトでのコントロールのロードになります。私のフォームをリロードするたびに、変更は失われます。
On MsdnにあるTypeConverterチュートリアルを試しましたが、正しく動作しませんでした。私のオブジェクトがデザイングリッド内で完全にグレーアウトされていることを除いて、すべてのものがうまくコンパイルされました(メーピーピング全体ではなくアクセサープロパティのみ)。私が気付いたもう一つの問題は、このメソッドはUserControlsのために特別に設計されていないということです.UserControlsにはいくつかの異なる変更可能なプロパティがあり、それぞれに対してオーバーロードを持つことはできません。
だから、私は次の質問を持っている:
- は私が実用的にやっているか、それとも私の構造の道オフが規範です。私はその属性に多くの冗長性があると確信しています。
- 別のUserControl \ toolstriphost 'parent'に含まれるusercontrol 'child'をシリアル化する正しい方法は何ですか。 '子'のプロパティはすべて単純値(文字列、小数点など)です。
- TypeConverterクラスが実装されていないときに、プロパティ(ラベルのテキストなど)を変更するたびに、オブジェクトのペイントがすべて終了し、コンテキスト\メニューまたはフォームを取り除くまで、奇妙な動作をします。私が変更を加えたので、デザイナーに再塗装を知らせる適切な方法はありますか? (私は無効にしていました。
ありがとうございます。私はこれを研究し続け、質問を更新し続けるつもりです。
NumericUpDownToolStripItem Class:
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability::All)]
public ref class NumericUpDownToolStripItem : public ToolStripControlHost
{
public:
[DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property LabeledNumericUpDown ^LabeledNumericUpDownControl
{
LabeledNumericUpDown ^get() { return (LabeledNumericUpDown^)this->Control; }
}
public: NumericUpDownToolStripItem(void) :
ToolStripControlHost(gcnew LabeledNumericUpDown()) {}
protected: void OnSubscribeControlEvents(Control ^control) new { //irrelevant to question }
protected: void OnUnsubscribeControlEvents(Control ^control) new { //irrelevant to question }
};
public ref class LabeledNumericUpDown : public UserControl
{
public: [ DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property String ^DisplayText {
String ^get() {
return this->label->Text;
}
void set(String ^val) {
if(this->label->Text != val)
{
this->label->Text = val;
this->Invalidate();
}
}
}
//constructor
//destructor
//initiailecomponent
};
が、これは、私はこの正確な問題に対処見つけることができる唯一のポストのようです。私はあなたのコントロールのホストデザイナーを見えるようにするためにあなたが何をしたのか疑問に思っています。私が何をしても、ビジュアルスタジオに表示させることはできません。私はMSDNの主張がデザイナーのサポートを可能にするために必要なものすべてを適用しました。いくつかの指針は非常に高く評価されます。 –
私は何をしたのか正確には覚えていませんが、このコントロールがリリースされ、「製品」になっていることはわかっています。私は、コードを追跡し、コントロール自体に何か違いがあるかどうかを再確認しようとします。 – greggorob64
私の新しい投稿を確認する、私は現在の作業設定を再投稿 – greggorob64