0

という UserControl を作成しましたToggle。これが私のコードです。

[DefaultEvent("Click")]
public partial class Toggle : UserControl {

    public bool ToggleStatus { get { return toggleStatus; } }
    private bool toggleStatus { get; set; }

    public Toggle() {
        InitializeComponent();
        toggleStatus = true;
    }

    private void toggleClick(object sender, EventArgs e) {
        if (toggleStatus) { // currently set as "true" or "on"
            this.lblSwitch.Dock = DockStyle.Right;                
            this.pnlBackground.BackColor = System.Drawing.Color.Red;
            toggleStatus = false;
        } else { // currently set as "false" or "off"
            this.lblSwitch.Dock = DockStyle.Left;                
            this.pnlBackground.BackColor = System.Drawing.Color.Green;
            toggleStatus = true;
        }
    }
}

このtoggleClickメソッドは、 内のコントロールのクリック イベントに関連付けられていますUserControl。これはうまく発火します。

ただし、Toggleコントロールをフォームに配置し、イベントをそのクリックに関連付けようとすると、発生しません。

    private void toggleSoundClick(object sender, EventArgs e) {
        soundToggle = !soundToggle;
    }

UserControl とフォームの両方の Designer.cs ファイルで、適切なメソッドがクリック イベントに関連付けられていることを確認しました。

ユーザーコントロール:

this.lblSwitch.Click += new System.EventHandler(this.toggleClick);
this.pnlBackground.Click += new System.EventHandler(this.toggleClick);

Toggle(コントロールのどこをクリックしても発火させたいので、2つのコントロールに関連付けています)

形:

this.tglSound.Click += new System.EventHandler(this.toggleSoundClick);

UserControl の予想される動作は、起動することですtoggleClick(発生します)。その後、フォームが起動しますtoggleSoundClick(発生しません)。この同じプロジェクトで設計および使用した他の UserControls で、この動作が正常に機能することを確認しました。

明確にするために:

という UserControl がありServerDisplayます。ServerDisplayランダムな MessageBox を表示する (ServerDisplay のコード内の)バックグラウンド パネルのクリック イベントに関連付けられたメソッドがあります。

    private void ServerDisplay_Click(object sender, EventArgs e) {
        MessageBox.Show("test");
    }

次に、ServerDisplayフォーム内にコントロールが含まれています。クリックイベントにも関連付けられたメソッドがあります(フォームのコード内)

    private void serverDisplayClick(object sender, EventArgs e) {
        if (loaded) {
            ServerDisplay display = (ServerDisplay)sender;
            this.lblLastServer.Text = "Last server joined was " + display.Server.Name + " at " + DateTime.Now.ToString("h:mm tt");
            centerControl(this.lblLastServer);
        }
    } 

フォームのコントロールをクリックするとServerDisplay、MessageBox (内のコードServerDisplay) が表示され、コード (フォームのコード) で指定したラベルが更新されます。これは意図された動作ですが、他の では機能しませんUserControl

4

1 に答える 1

0

私はついにそれを理解しました!コントロールをセットアップした方法で、コントロール自体、背景全体を埋めるパネル (これを色に使用)、および最初のパネル内の別のパネルを「スイッチ」として機能させました。

最初のパネルを取り除き、コントロールの背景を色に、小さなパネルをスイッチに使用すると、背景をクリックすると機能しますが、「スイッチ」パネルをクリックすると機能しません。これにより、これとは別に尋ねなければならない質問がさらに増えると思いますが、少なくとも答えは得られました。

于 2014-06-05T13:53:10.520 に答える