0

次のプロパティを持つプロパティグリッドで表示しているクラスがあります。

private Color _borderColor = Color.Black;
[Browsable(true)]
[Category("Appearance")]
[DisplayName("Border Color")]
[Description("The color of the border.")]
[DefaultValue(typeof(Color), "Black")]
public virtual Color BorderColor
{
    get
    {
        return _borderColor;
    }
    set
    {
        if (_borderColor != value)
        {
            _borderColor = value;

            Invalidate();
        }
    }
}

プロパティグリッドを使用してこのプロパティを変更すると、さまざまな断続的な問題が発生します。

最初は、ドロップダウンポップアップを開くことができます。しかし、色を選択しても、プロパティは変更されません。デバッグ時には、「セット」アクセサーも呼び出しません。この時点で、色の名前を入力してEnterキーを押しても、色は変わりません。

オブジェクトの選択を解除し(プロパティグリッドのselecteditemをnullに設定)、オブジェクトを再度選択すると、名前を入力して色を変更できます。しかし、ポップアップはまだ機能しません。

ドロップダウン矢印をクリックしても、バグが発生してポップアップが開かない場合があります。

編集:

特にポップアップの問題です。ポップアップを使用しない場合、グリッチは発生しません。ポップアップを開くと、基本的に、コントロール全体がフォーカスを失うまで、コミットされている変更(PropertyChangedイベントの送信)が一時停止されます。したがって、別のウィンドウまたは別のフォーカス可能なコントロールをクリックすると、プロパティグリッドが変更を更新します。

問題は、ダブルクリックまたはEnterキーを押すと変更がコミットされるのに、ポップアップの項目をクリックしてもコミットされないのはなぜですか?

4

1 に答える 1

1

問題の原因を突き止めました。プロパティグリッドの親の1つにウィンドウスタイルWS_EX_COMPOSITEDを設定しました。このスタイルを無効にすると、PropertyGridが再び正常に機能します。

残念ながら、アプリケーションのちらつきを減らすためにこのスタイルが必要です。したがって、オブジェクトのプロパティを変更するには、PropertyGrid以外のものを使用する必要があります。

于 2012-11-21T16:34:19.957 に答える