Вопрос по user-controls, winforms, c# – C # UserControl Видимое свойство не меняется

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

ucFollow - это пользовательский UserControl, ничего особенного. Приведенный выше код распечатывает:

False
False

Хуже всего то, что этоdoes переключать фактическую видимость UserControl (т.е. ucFollow появляется после вызова этого кода), но кажется, что свойство Visible не хорошо видно на бэкэнде и не отражает изменения, даже если сам интерфейс

Я даже не знаю, с чего начать устранение неполадок. У кого-нибудь есть какие-либо идеи относительно того, что могло бы дистанционно вызвать этот вид безумия?

Изменить: это с помощью стандартного C # WinForm в Visual Studio 2010.

Видна ли форма при запуске этого кода (т.е. выполняется ли этот код в событии Form.Load?). Если элемент управления физически не виден, он будет возвращать значение false, пока не станет. SwDevMan81
@TheDramaLlama Нам, конечно, понадобится воспроизводимый пример. У нас нет вашей кодовой базы, и мы можем только догадываться. asawyer
Есть ли в игре иерархия управления? Назначение visible to true не обязательно указывает, что элемент управления видим, если он содержится в родительском элементе, который не виден. Gabriel Isenberg
Может быть много причин, чтобы увидеть такое поведение, я бы не стал прыгать прямо к выводу об ошибке в C #. Пожалуйста, предоставьте простой воспроизводимый пример. asawyer
Что ж, если вы сломали C #, я собираюсь исправить это. Jay Riggs

Ваш Ответ

3   ответа
4

что свойство Visible для элементов управления на самом деле является свойством (с помощью get; set;), и набор присваивает внутренний член m_Visible, но метод get просматривает все родительские элементы управления и возвращает true, только если все они имеют m_Visible == true.

27

Оказывается, виновником было свойство Form.Visible. Прежде чем для Form.Visible будет установлено значение true, все элементы управления в форме будут невидимы (Visible = false), несмотря ни на что.

Тем не менее, вы все еще можетеset Видимые свойства - они просто не вступят в силу, пока для свойства Form.Visible не будет установлено значение true.

Другими словами, когда я звонилucFollow.Visible = trueмоя программа действительно регистрировала его - однако на тот момент в коде родительский объект Form.Visible из ucFollow был все еще ложным. Следовательно, и отладчик, и мои операторы печати распознали, "Эй, родительская форма этого элемента управления все еще не видна, поэтому этот элемент управления не виден". Период & Quot.

Как только форма стала видимой, все изменения вступили в силу, и все заработало отлично.

Мораль истории: не полагайтесь на свойства видимости ваших элементов управления, если только форма, содержащая их, уже видна и работает.

Если вы хотите выяснить, является ли контрольwould be видимый (если родительский элемент управления был виден), вы можете увидеть мой вопросhere для решения
Вы можете пометить это как ответ, это вполне нормально. Другое странное и замечательное поведение элементов управления видимостью (в режиме разработки) - это когда у вас есть UserControl, который вы не объявляете в InitializeComponent () .. (по какой-либо причине) ... если вы открываете форму, элемент управления не отображается и при этом это не перечислено в Раскрывающемся списке свойств элементов управления.
3

Это опасность предположения, что свойства и поля - это одно и то же. Они конечно очень похожиconceptually (в этом-то и дело), но они совершенно не одинаковы механически. Посмотрите на что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.)

Ваш ответ лежит где-то в этом мучительном лабиринте логики.

Я чувствую, что мое решение может быть связано с чем-то в вышеупомянутом лабиринте логики, но это пятница, и я не могу найти его. :) sichinumi

Похожие вопросы