Visual Studio Designer не устраивает мой TabControl, что я могу сделать?(.NET / C #) - PullRequest
0 голосов
/ 30 июля 2010

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

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

Могу ли я чем-нибудь помочь визуальной студии? Поскольку, пока он не выбрасывает ошибки, он становится немного утомительным. Я использую Visual Studio 2008.

Вот код, который расширяет элемент управления вкладками, и если кто-нибудь увидит какие-либо проблемы, которые могут быть причиной этого, он будет очень благодарен.

public class VerticalTabControl : TabControl
{
    private Color tabColour1 = Color.AliceBlue;

    public Color TabColour1
    {
        get { return tabColour1; }
        set { tabColour1 = value; this.Refresh(); }
    }

    private Color tabColour2 = Color.White;

    public Color TabColour2
    {
        get { return tabColour2; }
        set { tabColour2 = value; this.Refresh(); }
    }

    private Color selectedTabColor1 = Color.AliceBlue;

    public Color SelectedTabColor1
    {
        get { return selectedTabColor1; }
        set { selectedTabColor1 = value; this.Refresh(); }
    }

    private Color selectedTabColor2 = Color.White;

    public Color SelectedTabColor2
    {
        get { return selectedTabColor2; }
        set { selectedTabColor2 = value; this.Refresh(); }
    }

    private Color backgroundColour = Color.White;

    public Color BackgroundColour
    {
        get { return backgroundColour; }
        set { backgroundColour = value; this.Refresh(); }
    }

    private Color tabTextColour = Color.Black;

    public Color TabTextColour
    {
        get { return tabTextColour; }
        set { tabTextColour = value; this.Refresh(); }
    }

    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);
        this.Parent.Resize += new EventHandler(Parent_Resize);
    }

    void Parent_Resize(object sender, EventArgs e)
    {
        this.Refresh();
    }


    public VerticalTabControl()
        : base()
    {
        this.Alignment = TabAlignment.Left;
        this.SizeMode = TabSizeMode.Fixed;
        this.ItemSize = new Size(50, 120);
        this.DrawMode = TabDrawMode.OwnerDrawFixed;
        this.DrawItem += new DrawItemEventHandler(VerticalTabControl_DrawItem);          
    }

    void VerticalTabControl_DrawItem(object sender, DrawItemEventArgs e)
    {
        Graphics g = e.Graphics;
        TabControl ctrl = sender as TabControl;
        String sText = ctrl.TabPages[e.Index].Text;

        Rectangle r = new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);

        if (e.Index == ctrl.SelectedIndex)
        {
            using (LinearGradientBrush gb = new LinearGradientBrush(r, this.selectedTabColor1, this.selectedTabColor2, LinearGradientMode.Horizontal))
            {
                e.Graphics.FillRectangle(gb, r);
            }
        }
        else
        {
            using (LinearGradientBrush gb = new LinearGradientBrush(r, this.tabColour1, this.tabColour2, LinearGradientMode.Horizontal))
            {
                e.Graphics.FillRectangle(gb, r);
            }
        }

        // Set up the page and the various pieces.
        TabPage page = ctrl.TabPages[e.Index];

        // Set up the offset for an icon, the bounding rectangle and image size and then fill the background.
        int iconOffset = 0;
        Rectangle tabBackgroundRect = e.Bounds;

        // If we have images, process them.
        if (this.ImageList != null)
        {
            // Get sice and image.
            Size size = this.ImageList.ImageSize;
            Image icon = null;
            if (page.ImageIndex > -1)
              icon = this.ImageList.Images[page.ImageIndex];
            else if (page.ImageKey != "")
              icon = this.ImageList.Images[page.ImageKey];

            // If there is an image, use it.
            if (icon != null)
            {
             Point startPoint = new Point(tabBackgroundRect.X + 6,
                   tabBackgroundRect.Y + 2 + ((tabBackgroundRect.Height - size.Height) / 2));
               e.Graphics.DrawImage(icon, new Rectangle(startPoint, size));
                iconOffset = size.Width + 4;
            }
        }

        // Draw out the label.
        SizeF sizeText = g.MeasureString(sText, ctrl.Font);
        int iX = e.Bounds.Left + 6 + iconOffset;
        int iY = e.Bounds.Top + (e.Bounds.Height / 2) - (int)(sizeText.Height / 2);

        using (Brush ForeBrush = new SolidBrush(tabTextColour))
        {
            g.DrawString(sText, ctrl.Font, ForeBrush, iX, iY);
        }

        Rectangle rec = ctrl.GetTabRect(ctrl.TabPages.Count - 1);
        Rectangle recF = new Rectangle(0, rec.Bottom, this.ItemSize.Height, ctrl.Height - rec.Bottom);
        using (SolidBrush bb = new SolidBrush(backgroundColour))
        {
            g.FillRectangle(bb, recF);
        }
    }

}

1 Ответ

1 голос
/ 18 августа 2010

оказывается, что это был оскорбительный бит кода

protected override void OnParentChanged(EventArgs e)
{
    base.OnParentChanged(e);
    this.Parent.Resize += new EventHandler(Parent_Resize);
}

'this.Parent' иногда был нулевым, и поэтому было бы выдано исключение, которое привело бы к отказу конструктора.

Теперь исправили это, а также убрали перехват событий, чтобы я не оставлял перехваты везде.Кажется, теперь работает нормально.Спасибо за вашу помощь, кто бы ни ответил на это и удалил свой ответ по некоторым причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...