19
Debug.WriteLine(ucFollow.Visible);
ucFollow.Visible = true;
Debug.WriteLine(ucFollow.Visible);

ucFollow はカスタムの UserControl であり、派手なものではありません。上記のコードは以下を出力します。

False
False

最悪の部分は、これにより UserControl の実際の可視性切り替えられる (つまり、このコードが呼び出されると ucFollow が表示される) ことですが、どういうわけか、Visible プロパティがバックエンドで表示されず、表示されないようです。 UI 自体は反映しますが、変更を反映します。

これのトラブルシューティングをどこから始めればよいかさえわかりません。この種の狂気をリモートで引き起こす可能性があるものについて、誰か考えがありますか?

編集:これは、Visual Studio 2010 の標準 C# WinForm を使用したものです。

4

3 に答える 3

35

私はC#を壊しませんでした!:)

犯人はForm.Visibleプロパティであることが判明しました。Form.Visibleがtrueに設定される前は、フォーム上のすべてのコントロールは、何があっても非表示(Visible = false)になります。

ただし、 Visibleプロパティを設定することはできます。Form.Visibleプロパティがtrueに設定されるまで、これらのプロパティは有効になりません。

言い換えると、私が電話をかけたときucFollow.Visible = true、私のプログラムは実際にそれを登録していました-しかし、コードのその時点では、ucFollowの親Form.Visibleはまだfalseでした。したがって、Debuggerと私のprintステートメントの両方が、「ねえ、このコントロールの親フォームはまだ表示されていないので、このコントロールは表示されません。期間」と認識しました。

フォームが表示されるとすぐに、すべての変更が有効になり、すべてがうまく機能しました。

話の教訓:コントロールを含むフォームがすでに表示されて実行されている場合を除き、コントロールの表示プロパティに依存しないでください。

于 2012-06-22T17:44:39.013 に答える
8

原因は、コントロールの Visible プロパティが実際にはプロパティ ( get; set; を使用) であり、セットが内部 m_Visible メンバーに割り当てられますが、get はすべての親コントロールを調べ、すべての親コントロールが m_Visible == true の場合にのみ true を返します。

于 2013-11-05T09:17:16.050 に答える
4

これは、プロパティとフィールドが同じものであると想定するのは危険です。もちろん、それらは概念的には非常に似ていますが(それがポイントです)、機械的には同じではありません。ucFollow.Visible = true実際に何が行われているか見てみましょう:

protected virtual void SetVisibleCore(bool value)
{
    try
    {
        HandleCollector.SuspendCollect();
        if (this.GetVisibleCore() != value)
        {
            if (!value)
            {
                this.SelectNextIfFocused();
            }
            bool flag = false;
            if (this.GetTopLevel())
            {
                if (this.IsHandleCreated || value)
                {
                    SafeNativeMethods.ShowWindow(new HandleRef(this, this.Handle), value ? this.ShowParams : 0);
                }
            }
            else
            {
                if (this.IsHandleCreated || (value && this.parent != null && this.parent.Created))
                {
                    this.SetState(2, value);
                    flag = true;
                    try
                    {
                        if (value)
                        {
                            this.CreateControl();
                        }
                        SafeNativeMethods.SetWindowPos(new HandleRef(this.window, this.Handle), NativeMethods.NullHandleRef, 0, 0, 0, 0, 23 | (value ? 64 : 128));
                    }
                    catch
                    {
                        this.SetState(2, !value);
                        throw;
                    }
                }
            }
            if (this.GetVisibleCore() != value)
            {
                this.SetState(2, value);
                flag = true;
            }
            if (flag)
            {
                using (new LayoutTransaction(this.parent, this, PropertyNames.Visible))
                {
                    this.OnVisibleChanged(EventArgs.Empty);
                }
            }
            this.UpdateRoot();
        }
        else
        {
            if (this.GetState(2) || value || !this.IsHandleCreated || SafeNativeMethods.IsWindowVisible(new HandleRef(this, this.Handle)))
            {
                this.SetState(2, value);
                if (this.IsHandleCreated)
                {
                    SafeNativeMethods.SetWindowPos(new HandleRef(this.window, this.Handle), NativeMethods.NullHandleRef, 0, 0, 0, 0, 23 | (value ? 64 : 128));
                }
            }
        }
    }
    finally
    {
        HandleCollector.ResumeCollect();
    }
}

(コードは ILSpy の厚意によるものです。)

あなたの答えは、その苦しめられた論理の迷路のどこかにあります。

于 2012-06-22T17:32:05.527 に答える