3

コンボボックスの横に小さなピック ボタンとして常に使用するボタンがあります。ボタンをクリックすると、より大きな完全なリストが開きます。物事のこの側面はうまく機能し、私はこれに問題はありません..

私の問題は、あなたが選んだ醜いアイコンを私の素敵なアイコンに変更してもらえないかと誰かが私に言ったときです。

私はがらくたになりました、私は多くのフォームにこれらのボタンを何百も持っています。そこで、PickButton というカスタム コントロール (標準のボタンと既定のプロパティ セットのヒープ) を作成し、代わりにフォームのどこにでもドロップすることにしました。PickButton カスタム コントロールのコードでは、いくつかのプロパティと画像を顧客の素敵なアイコンに設定しました。

そこで、ツールボックスからフォームに PickButton をドロップしました。今度は、顧客が選択した安っぽいアイコンではなく、自分の素敵なアイコンに戻して、PickButton カスタム コントロールのコードを変更しようと考えています。しかし、PickButton の実行時のコードは、顧客アイコンを持つデザイナー ファイル内のコードの前に発生するため、その顧客アイコンを取り除くことはできません。

したがって、私の目的は、PickButton コントロールを作成し、アイコンやその他のプロパティを 1 か所で変更できるようにすることでした。すべてのプロパティは、コントロールのインスタンスが作成されてフォームに表示されるときに設定されます。

私はそれほど賢くなく、間違った方法でタスクを達成しようとしましたか???

これは私の PickButton カスタム コントロール クラスです

public class PickButton : Button
{

    public PickButton()
    {
        InitialiseButton();
    }

    internal void InitialiseButton()
    {
        this.ImageAlign = ContentAlignment.MiddleCenter;
        this.Image = WindowsFormsApplication1.Properties.Resources.Cancel.ToBitmap();
        this.Size = new Size( 28, 28 );
        this.Dock = DockStyle.Fill;
        this.Margin = new Padding( 0, 2, 2, 0 );
        this.Text = string.Empty;
    }
}

フォームにドロップすると、デザイナーのコードは次のようになります。

 // 
        // pickButton1
        // 
        this.pickButton1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.pickButton1.Image = ((System.Drawing.Image)(resources.GetObject("pickButton1.Image")));
        this.pickButton1.Location = new System.Drawing.Point(0, 0);
        this.pickButton1.Margin = new System.Windows.Forms.Padding(0, 2, 2, 0);
        this.pickButton1.Name = "pickButton1";
        this.pickButton1.Size = new System.Drawing.Size(284, 262);
        this.pickButton1.TabIndex = 0;
        this.pickButton1.Text = "pickButton1";
        this.pickButton1.UseVisualStyleBackColor = true;

ここで画像を変更したいので、PickButton コードを変更して別のアイコンを使用します

this.Image = WindowsFormsApplication1.Properties.Resources.Browse.ToBitmap();

アプリケーションを実行すると、最初のアイコンが引き続き表示されます。これは、デザイナー ファイルのこのコード行が原因です。

        this.pickButton1.Image = ((System.Drawing.Image)(resources.GetObject("pickButton1.Image")));
4

2 に答える 2

0

すべてのプロパティを 1 か所で設定するという概念は良いアイデアでしたが、正しく実装されていませんでした。このクラスは、Button からではなく UserControl から継承します。これを UserControl にすることで、デザイナーを使用して、ボタンの既定のイメージなど、必要なすべてのプロパティを設定できます。デザイナーでそれを設定し、ツールボックスからフォームに UserControl をドラッグ アンド ドロップするだけです。コンボボックスで「PickButton」コントロールのみを使用している場合は、コンボボックスを UserControl にも配置します。将来、ボタン イメージ (またはその他のプロパティ) を変更したい場合は、ctlPickButton で変更でき、プロジェクト全体で使用されるすべてのインスタンスに変更が反映されます。

ctlPickButton:

public partial class ctlPickButton : UserControl
{
    public event EventHandler pickButtonClicked;

    public ctlPickButton()
    {
        InitializeComponent();
    }

    //Allows buttons image to be set in code if necessary
    public Image Image
    {
        get
        {
            return button1.Image;
        }
        set
        {
            if (Image != null)
            {
                button1.Image = value;
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (pickButtonClicked != null)
        {
            pickButtonClicked(sender, e);
        }
    }
}

デモフォーム:

    public Form1()
    {
        InitializeComponent();

        ctlPickButton1.pickButtonClicked += new EventHandler(ctlPickButton1_pickButtonClicked);
        ctlPickButton2.pickButtonClicked += new EventHandler(ctlPickButton2_pickButtonClicked);
    }

    void ctlPickButton2_pickButtonClicked(object sender, EventArgs e)
    {
        if (comboBox2.SelectedItem != null)
        {
            MessageBox.Show(comboBox2.SelectedItem.ToString());
        }
    }

    void ctlPickButton1_pickButtonClicked(object sender, EventArgs e)
    {
        if (comboBox1.SelectedItem != null)
        {
            MessageBox.Show(comboBox1.SelectedItem.ToString());
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.Items.Add("French");
        comboBox1.Items.Add("Spanish");
        comboBox1.Items.Add("English");
        comboBox1.Items.Add("German");

        comboBox2.Items.Add("Pizza");
        comboBox2.Items.Add("Hamburger");
        comboBox2.Items.Add("Potato");
        comboBox2.Items.Add("Chicken");

        //Shows how the default image set in the designer can be overwritten for a 
        //specific instance using the "Image" property
        ctlPickButton2.Image = Testbed.Properties.Resources.searchIcon2;
    }
}

デザイナーの ctlPickButton の画像

ここに画像の説明を入力

于 2013-10-24T13:54:42.693 に答える
0

シンプルでクリーンな解決策を見つけたと思います:

CustomButtonクラス (から継承)System.Windows.Forms.Buttonで、メソッドをオーバーライドしRefresh()、ボタンの画像を表示したいものに設定します。

public class CustomButton : Button
{
  public override void Refresh()
  {
    Image = MyResources.HappyFace;
  }
}

your のインスタンスを保持するフォームでは、 の後にコンストラクターをCustomButton呼び出すだけです。customButton.Refresh()InitializeComponent()

public partial class MainForm : Form
{
  public MainForm()
  {
    InitializeComponent();

    customButton.Refresh();
  }
}

デモ アプリケーションを Github にアップしました。

于 2013-10-25T09:28:49.363 に答える