2

「キャンバス」(これは単なるパネル コントロールです) があり、ユーザーはボタンをクリックして特定のコントロール、つまりラベル、リンク ラベル、画像などをキャンバスに追加できます。追加したばかりのラベルのテキストを編集できます...

しかし、クリックしたコントロールに新しいフォントと新しい色を選択させようとしていますが、常に機能するとは限りません...

私が持っているコードは次のとおりです。

private string SelectedControl;

コントロールをクリックすると:

private void label_Click(object sender, EventArgs e)
{
    Label label = (Label)sender;
    SelectedControl = label.Name;
}

ユーザーがフォントを選択したとき:

private void setfont()
{
    foreach(Control control in Canvas.Controls)
    {
        if(control.Name == SelectedControl)
        {
            control.Font = selectedfont;
        }
    }
}

したがって、このコードは機能しますが、常に機能するとは限りません。後で参照できるように、Last-Clicked コントロールを何らかの方法で追跡する他の方法を知っている人はいますか?

4

1 に答える 1

3

文字列名を保存する代わりに、最後にクリックしたコントロール自体への参照を保存してみませんか?

したがって、コードは次のようになります。

private Control SelectedControl;

private void label_Click(object sender, EventArgs e)
{
    Control ctrl = sender as Control;
    if(ctrl != null)
        SelectedControl = ctrl;
}

private void setfont()
{
    SelectedControl.Font = selectedfont;
}

参照を保存するのにかかる費用はごくわずかであり、参照に直接アクセスできます。

編集:参照をコントロールに変更することで、型キャストすることなく、さまざまな種類のコントロールを参照できます。私がこのコードを実行する理由:

Control ctrl = sender as Control;
if(ctrl != null)
        SelectedControl = ctrl;

より安全な型キャストです。送信者が何らかの理由でControlから継承しない場合、その送信者は型キャストされず、labelはnullになりますが、例外は発生しません。

選択することで変更できるようにするすべてのコントロールに対して、シングルクリックイベントハンドラーを設定できます。コードでコントロールを作成し、イベントを手動でフックする場合、これははるかに簡単に機能します。

どのコントロールが選択されているかを示すために、境界線または効果を実行することを検討することをお勧めします。これは、次のようにして実行できます。

if(ctrl != null)
{
    Deselect(SelectedControl); //Deselects the old control
    SelectedControl = ctrl;
    Select(SelectedControl); //Selects the new control
}

ここで、選択解除と選択は、いくつかの派手な効果または境界線を実行します。

お役に立てれば。

于 2009-10-07T12:25:34.203 に答える