Проблема с рендерингом проекта MetroFramework для Windows forms и управления вкладками

#c# #winforms #user-interface #windows-forms-designer #metroframework

#c# #winforms #пользовательский интерфейс #windows-forms-designer #metroframework

Вопрос:

Я не уверен, с чего начать здесь, чтобы устранить неполадки и поработать над сторонним кодом, чтобы попытаться исправить это, поэтому я подумал, что спрошу здесь и покажу экран проблемы. Я использую сторонний пакет Windows form «metro controls» от https://thielj.github.io/MetroFramework / и он выглядит немного устаревшим и больше не поддерживается, и единственная реальная проблема, с которой я сталкиваюсь, заключается в том, что элемент управления tab, похоже, содержит дополнительный «мусор» для рендеринга, который исчезает при нажатии на него. Но я не знаю, почему он нарисован в первую очередь или как его удалить / исправить и обновить пакет на github. Пакет пользовательского интерфейса полезен, он делает простой проект Windows form намного приятнее и имеет гораздо лучший пользовательский интерфейс, поэтому я его выбрал.

Кто-нибудь знаком с этой библиотекой и имеет похожие проблемы или знает, как лучше всего подойти к ее исправлению самостоятельно? Имейте в виду, что я вообще не знаком с частью Windows forms для рисования / графического интерфейса и обычно ссылаюсь на онлайн-материалы, когда дело доходит до рисования или работы с типом пользовательского интерфейса.

введите описание изображения здесь

Комментарии:

1. Кажется Control.Invalidate , вызов отсутствует. Попробуйте вызвать этот метод рассматриваемого элемента управления из соответствующего события. Например, когда он отображается, активируется, изменяется … и т. Д. И посмотрите, как это происходит.

2. Никакого эффекта, это также приводит к тому, что дочерние элементы становятся недействительными / перерисовываются или я должен выборочно попробовать это на куче элементов управления, вложенных вниз, которые я тоже добавил? Странно, что это также отображается в Visual Studio designer, а также в запущенном приложении…

3. Перейдите true также к аннулированию дочерних элементов : Control.Invalidate(true); . Control Здесь означает рассматриваемый элемент управления metro.

4. Похоже, это не работает, я готов связаться с фрилансерами, чтобы посмотреть / улучшить и сделать PR для репозитория MetroFramework, если он больше не поддерживается за плату, поскольку это коммерческий проект, с которым у нас возникли проблемы :). Я попытался просмотреть исходный код и попытаться понять, где проблема может быть экспериментом, но пока безуспешно, то же самое касается некоторых других незначительных проблем, с которыми я сталкиваюсь: (.

5. О, жаль это слышать. Возможно, пришло время создать собственную библиотеку пользовательского интерфейса. Это увлекательное и познавательное путешествие. Также вы можете попробовать WPF, у него гораздо больше возможностей.

Ответ №1:

Оказалось, что вместо этого я нашел эту библиотеку (немного новее / больше обновлений) https://www.nuget.org/packages/MetroModernUI / но у меня все еще есть некоторые похожие проблемы, с которыми я сталкиваюсь, однако я немного изменил код, чтобы помочь решить одну из проблем, с которой я сталкиваюсь, жизненный цикл события OnDrawItem, похоже, исчез для установки свойства OwnerDrawFixed для элемента управления tab.

Вот код, который я изменил в MetroTabControl.cs, и я просто использую локальную версию / сборку для поддержки любых настроек и улучшений, которые я должен сделать, поскольку у меня есть несколько других проблем.

         private void DrawTab(int index, Graphics graphics)
        {
            Color foreColor;
            Color backColor = BackColor;

            if (!useCustomBackColor)
            {
                backColor = MetroPaint.BackColor.Form(Theme);
            }

            TabPage tabPage = TabPages[index];
            Rectangle tabRect = GetTabRect(index);

            if (!Enabled || tabDisable.Contains(tabPage.Name))
            {
                foreColor = MetroPaint.ForeColor.Label.Disabled(Theme);
            }
            else
            {
                if (useCustomForeColor)
                {
                    foreColor = DefaultForeColor;
                }
                else
                {
                    foreColor = !useStyleColors ? MetroPaint.ForeColor.TabControl.Normal(Theme) : MetroPaint.GetStyleColor(Style);
                }
            }

            if (index == 0)
            {
                tabRect.X = DisplayRectangle.X;
            }

            Rectangle bgRect = tabRect;

            tabRect.Width  = 20;

            using (Brush bgBrush = new SolidBrush(backColor))
            {
                graphics.FillRectangle(bgBrush, bgRect);
            }

            TextRenderer.DrawText(graphics, tabPage.Text, MetroFonts.TabControl(metroLabelSize, metroLabelWeight),
                                  tabRect, foreColor, backColor, MetroPaint.GetTextFormatFlags(TextAlign));

            //HACK not properly handling the owner draw fixed event/override life cycle so we can fire it ourselves and if something is listening
            //      it will execute
            if (this.DrawMode == TabDrawMode.OwnerDrawFixed)
            {
                OnDrawItem(new DrawItemEventArgs(graphics, this.Font, tabRect, index, DrawItemState.None));
            }
        }
  

Для другой проблемы с пользовательским интерфейсом я отслеживаю, где я могу сделать недействительными или исправить нечетные дополнительные кнопки / интерактивные исчезающие области в элементе управления вкладками или панелях для этой среды улучшения пользовательского интерфейса.

Ответ №2:

Происходит то, что должна быть какая-то ошибка, связанная с размером MetroTabControl, и вы можете исправить это с помощью следующего кода:

         this.metroTabPage1.VerticalScrollbarBarColor = false;
        this.metroTabPage1.VerticalScrollbarSize = 0;