4

WPF ではなく、標準の WinForms で .NET C# を使用しています。

私はこのような状況にあります。.NET に似ていますが、もう少し機能を備えた月間カレンダーのユーザー コントロールを作成しています。日付を表すボタン オブジェクトでいっぱいのユーザー コントロール フォームがあります。ボタンは、状態 (選択、マウスオーバー、週末など) に応じて異なる色で色付けできます。

私がそれを機能させたい方法は、親(ユーザーコントロール)クラスから色を付けるのではなく、色を決定する状態を受け入れるようにボタンクラスを拡張することです。現時点では 10 色ありますが、ユーザー コントロール コードを色付け条件で台無しにしたくありません。

また、ブラウズ可能なデザイナー プロパティを使用して、デザイン時にすべての色を選択したいと考えています。問題は、デザイナーがユーザー コントロール クラスで定義されたプロパティのみを表示し、その子 (ボタン) を表示しないことです。

この問題の回避策はありますか? 簡単に言うと、ボタンの内部プロパティを使用して色を変更し、デザイナー プロパティを使用して、手動でハード コーディングするのではなく、デザイン時に色を選択できるようにしたいと考えています。

4

4 に答える 4

5

わかりました、私はトラフコードを説明しようとします:

たとえば、ユーザー コントロールとボタン クラスがあります。Button プロパティを公開し、デザイナーの MyControl プロパティ間で表示できるようにしたいと考えています。

class MyControl : UserControl
{
     private MyButton button;
     button.ChangeStyle("Selected");
}

class MyButton : Button
{
     private Color buttonColor;

     public void ChangeStyle(string styleName)
     {
          if (styleName == "Selected")
              this.BackColor = buttonColor;
     }

     [Browsable(true)]
     [Category("Button style")]
     public Color ButtonColor
     {
          get { return buttonColor; }
          set { buttonColor = value; }
     }
}

これは簡単な例です。通常、それぞれの背景色と前景色を含む 5 つの異なるスタイルがあります。そこで、MyControl クラスで色を管理する代わりに、MyButton クラスで色を定義したいと思います。しかし、この方法の問題は、MyControl プロパティのみに焦点を当てているため、MyButton クラスのプロパティがデザイナーに表示されないことです。

ところで。コード例で欠落しているコンストラクターやその他の基本クラスのものを無視します

私は使用できません:

[Category("Wonder Control")]
public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; }

MyControl (月の日数) には 30 個のボタンがあり、1 つのオブジェクトだけを参照することはできないためです。

于 2009-11-13T13:06:14.197 に答える
3

デザイナーでプロパティを表示するには、getter と setter を持つパブリック プロパティである必要があります。つまり、プロパティは getter のみです。プロパティにBrowsableAttributeBindableAttributeを指定して、デザイナーに強制的に表示させることもできます...

于 2009-11-13T12:45:29.867 に答える
1

ここでできることはいろいろあります。問題のコントロールをパブリック インターフェイスに公開することもできます (悪い答えですが)。しかし、それが良いアイデアかどうかはわかりません。

個人的には、関心のあるプロパティを再公開し、おそらくそれらを別のものに入れます[Category(...)]-セッターとゲッターの両方があることを確認します.

少し似ている:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

class MyControl : UserControl
{
    private Button button;
    private Label label;
    public MyControl()
    {
        button = new Button { Dock = DockStyle.Right, Text = "Click me" };
        label = new Label { Dock = DockStyle.Left};
        Controls.Add(button);
        Controls.Add(label);
    }
    [Category("Wonder Control")]
    public string CaptionText { get { return label.Text; } set { label.Text = value; } }
    [Category("Wonder Control")]
    public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } }
}
static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        using (Form form = new Form())
        using (MyControl ctrl = new MyControl())
        using (PropertyGrid grid = new PropertyGrid())
        {
            ctrl.ButtonBackColor = Color.Red;
            ctrl.CaptionText = "Caption";
            ctrl.Dock = DockStyle.Fill;
            grid.Dock = DockStyle.Right;
            form.Controls.Add(ctrl);
            form.Controls.Add(grid);
            grid.SelectedObject = ctrl;
            Application.Run(form);
        }

    }
}
于 2009-11-13T12:35:01.260 に答える
0

コントロール内のすべてのボタンが同じ外観を共有する場合、プロパティをコントロール レベルに置き、プロパティ セッターにすべてのボタンへの変更を反映させてみませんか? また、30 個の個別のボタン コントロールを使用すると、多くのオーバーヘッドが発生するように思えます...特定の日がいつクリックされたかを判断するために、日付のラベルを描画し、マウス クリック/ホバー イベントを処理することを検討しましたか?

于 2009-11-13T14:00:46.547 に答える