14

入力出力の 2 つのグループのコントロールを画面に表示する必要があります(したがって、2 つの状態があります: OnまたはOff )。したがってCheckBox、良い選択のようです。出力をチェックすると、それが設定されます。

ただし、入力を表示する場合、それに対するユーザーの操作はありません。ユーザーはその値を表示することのみが許可され、変更することはできません。

質問: チェックボを視覚的に読み取り専用にするにはどうすればよいですか?

可能な解決策について考えることができます:

  • 無効にしCheckBoxます。悪い例: ツールチップが表示されず (問題を解決できますか? 上の偽のパネルで解決できますか?)、視覚的に無効になっているのは良くありません (ユーザーに無効CheckBoxになっていると思わせたくありません)。
  • 別のコントロールを使用してください。どれ?Labelオン/オフ値の適切なプレースホルダーがありません。RadioButton見た目は異なりますが、通常、入力の値は独立しているのに対し、多くの中から 1 つの選択肢があることを意味します。
  • 独自のコンポーネントを作成します。全体を描画するのCheckBoxは少しやり過ぎです (正直なところ、Win7 の外観にする方法がわかりません)。ReadOnlyボックス部分に見た目だけを簡単に追加することはできますか?

皆さんはどう思いますか?

4

8 に答える 8

4

これは古い投稿ですが、それでも役立つ可能性があるため、ここに私の解決策があります。

読み取り専用の動作を行うには:

  • カーソルが上にあるときにハイライトを無効にするCheckBox
  • マウス クリックへの (論理的または視覚的な) 反応を無効にする
  • ツールチップを有効にする

クラスを継承して、CheckBoxマウスとキーボードの操作を無効にすることができます。

public class ReadOnlyCheckBox : CheckBox
{
    [System.ComponentModel.Category("Behavior")]
    [System.ComponentModel.DefaultValue(false)]
    public bool ReadOnly { get; set; } = false;

    protected override void OnMouseEnter(EventArgs e)
    {
        // Disable highlight when the cursor is over the CheckBox
        if (!ReadOnly) base.OnMouseEnter(e);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        // Disable reacting (logically or visibly) to a mouse click
        if (!ReadOnly) base.OnMouseDown(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Suppress space key to disable checking/unchecking 
        if (!ReadOnly || e.KeyData != Keys.Space) base.OnKeyDown(e);
    }
}

CheckBoxが読み取り専用であることを視覚的に明らかにするためForColorに、プロパティに従って を変更できReadOnlyます。

注: を変更するとForColor、テキストの色のみが変更されます。チェックマークの色は、OnPaintメソッドをオーバーライドして再描画することによってのみ変更できますCheckBox(私の知る限り)。

プロパティForColorに従って を変更する、前のコードの拡張バージョンを次に示します。ReadOnly

public class ReadOnlyCheckBox : CheckBox
{
    private bool _readOnly = false;
    private Color _readOnlyForeColor = Color.Gray;
    private Color _normalForeColor = Color.Black;

    [System.ComponentModel.Category("Behavior")]
    [System.ComponentModel.DefaultValue(false)]
    public bool ReadOnly
    {
        get => _readOnly;
        set
        {
            if (_readOnly != value)
            {
                _readOnly = value;
                UpdateForColor();
            }
        }
    }

    [System.ComponentModel.Category("Appearance")]
    [System.ComponentModel.DefaultValue(typeof(Color), "Black")]
    public Color NormalForeColor
    {
        get => _normalForeColor;
        set
        {
            if (_normalForeColor != value)
            {
                _normalForeColor = value;
                UpdateForColor();
            }
        }
    }

    [System.ComponentModel.Category("Appearance")]
    [System.ComponentModel.DefaultValue(typeof(Color), "Gray")]
    public Color ReadOnlyForeColor
    {
        get => _readOnlyForeColor;
        set
        {
            if (_readOnlyForeColor != value)
            {
                _readOnlyForeColor = value;
                UpdateForColor();
            }
        }
    }

    // Hide ForeColor from the editor
    [System.ComponentModel.Browsable(false)]
    [System.ComponentModel.EditorBrowsable(
        System.ComponentModel.EditorBrowsableState.Never)]
    public override Color ForeColor
    {
        get => base.ForeColor;
        set => base.ForeColor = value;
    }

    public ReadOnlyCheckBox()
    {
        UpdateForColor();
    }

    private void UpdateForColor()
    {
        ForeColor = ReadOnly ? ReadOnlyForeColor : NormalForeColor;
    }

    protected override void OnMouseEnter(EventArgs e)
    {
        // Disable highlight when the cursor is over the CheckBox
        if (!ReadOnly) base.OnMouseEnter(e);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        // Disable reacting (logically or visibly) to a mouse click
        if (!ReadOnly) base.OnMouseDown(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Suppress space key to disable checking/unchecking 
        if (!ReadOnly || e.KeyData != Keys.Space) base.OnKeyDown(e);
    }
}
于 2020-06-01T18:27:10.777 に答える
0

CheckBox実行時に通常のフローをキャンセルする機能があるため、 をクリックするイベントのリスナーを提供できます。

于 2013-11-11T09:24:55.230 に答える