2016-03-10 1 views
0

У меня есть некоторые пользовательские элементы управления, которые я использовал некоторое время. Несколько дней назад я сделал специальный флажок. Поскольку я не знаю синтаксиса C#, я сделал это в VB.NET. Проблема в том, что большинство бесплатных пользовательских элементов управления в Интернете находятся на C#. Мое решение состояло в том, чтобы скомпилировать их в DLL и использовать в моих приложениях.Преобразованный из vb.net в C# пользовательский элемент управления не отображается в панели инструментов

Я пошел вперед и преобразовал это в C# и попытался добавить его в свою DLL. Он вообще не появится в панели инструментов. Я думаю, что мне не хватает чего-то в коде, который не требуется VB.NET, но я не могу понять, что это такое.

Вот версия VB.NET, которая создает надлежащую DLL, которая дает мне настраиваемый инструмент.

Public Class ColorCheckBox 
    Inherits CheckBox 
    Public CheckColor As New SolidBrush(Color.Blue) 
    Public IndeterminateColor As New SolidBrush(Color.Red) 
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
     Dim CheckRegion As New Rectangle(1, 2, 11, 11) 

     Dim Points(15) As Point 

     Points(0) = New Point(1, 2) 
     Points(1) = New Point(4, 2) 
     Points(2) = New Point(6, 5) 
     Points(3) = New Point(9, 2) 
     Points(4) = New Point(12, 2) 
     Points(5) = New Point(12, 4) 
     Points(6) = New Point(9, 7) 
     Points(7) = New Point(12, 10) 
     Points(8) = New Point(12, 13) 
     Points(9) = New Point(9, 12) 
     Points(10) = New Point(6, 9) 
     Points(11) = New Point(3, 13) 
     Points(12) = New Point(1, 12) 
     Points(13) = New Point(1, 10) 
     Points(14) = New Point(4, 7) 
     Points(15) = New Point(1, 4) 

     MyBase.OnPaint(e) 

     If CheckState = CheckState.Checked Then 
      e.Graphics.FillRectangle(New SolidBrush(Color.White), CheckRegion) 
      e.Graphics.FillPolygon(CheckColor, Points) 
     ElseIf CheckState = CheckState.Indeterminate Then 
      e.Graphics.FillRectangle(New SolidBrush(Color.White), CheckRegion) 
      e.Graphics.FillPolygon(IndeterminateColor, Points) 

     End If 
    End Sub 

    Sub New() 
     ThreeState = True 
    End Sub 

    Public ReadOnly Property DBValue As Integer 
     Get 
      Select Case CheckState 
       Case CheckState.Unchecked 
        Return 0 
       Case CheckState.Checked 
        Return 1 
       Case CheckState.Indeterminate 
        Return 2 
       Case Else 
        Return 3 
      End Select 
     End Get 
    End Property 
End Class 

Это преобразованный код, который не работает. Он компилируется отлично, но не даст мне настраиваемый элемент управления, как указано выше.

using System.Windows.Forms; 
using System.Drawing; 

namespace ColorCheckBoxCS 
{ 
    public class ColorCheckBox : CheckBox 
    { 
     public SolidBrush CheckColor = new SolidBrush(Color.Blue); 
     public SolidBrush IndeterminateColor = new SolidBrush(Color.Red); 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      Rectangle CheckRegion = new Rectangle(1, 2, 11, 11); 

      Point[] Points = new Point[15]; 

      Points[0] = new Point(1, 2); 
      Points[1] = new Point(4, 2); 
      Points[2] = new Point(6, 5); 
      Points[3] = new Point(9, 2); 
      Points[4] = new Point(12, 2); 
      Points[5] = new Point(12, 4); 
      Points[6] = new Point(9, 7); 
      Points[7] = new Point(12, 10); 
      Points[8] = new Point(12, 13); 
      Points[9] = new Point(9, 12); 
      Points[10] = new Point(6, 9); 
      Points[11] = new Point(3, 13); 
      Points[12] = new Point(1, 12); 
      Points[13] = new Point(1, 10); 
      Points[14] = new Point(4, 7); 
      Points[15] = new Point(1, 4); 

      base.OnPaint(e); 

      if (CheckState == CheckState.Checked) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.White), CheckRegion); 
       e.Graphics.FillPolygon(CheckColor, Points); 
      } 
      else if (CheckState == CheckState.Indeterminate) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.White), CheckRegion); 
       e.Graphics.FillPolygon(IndeterminateColor, Points); 

      } 
     } 

     ColorCheckBox() 
     { 
      ThreeState = true; 
     } 

     public int DBValue 
     { 
      get 
      { 
       switch (CheckState) 
       { 
        case CheckState.Unchecked: 
         return 0; 
        case CheckState.Checked: 
         return 1; 
        case CheckState.Indeterminate: 
         return 2; 
        default: 
         return 3; 
       } 
      } 
     } 
    } 
} 

На стороне примечания, если кто-то хочет использовать этот код, идите вперед. Он делает флажок использовать три состояния и рисует X. Я использую его для двухуровневой системы аутентификации. Вы даже можете установить цвет кода X или изменить его в элементе управления. Отлично работает в VB.NET, и если он будет исправлен, он отлично подойдет на C#. Я планирую, чтобы он принял значение и установил CheckState, но я впервые попал в эту проблему. Я верну правильный код с набором, если он будет исправлен.

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

Любой, кто знает, в чем проблема, пожалуйста, помогите. Я не хороший продавец.

Пересмотренный Рабочий Кодекс;

using System.Windows.Forms; 
using System.Drawing; 

namespace ColorCheckBoxCS 
{ 
    public class ColorCheckBox : CheckBox 
    { 
     /// <summary> 
     /// The color of the X for Checked 
     /// </summary> 
     public Color CheckColor = Color.Blue; 

     /// <summary> 
     /// The color of the X for Indeterminate 
     /// </summary> 
     public Color IndeterminateColor = Color.Red; 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      SolidBrush CheckColorBrush = new SolidBrush(CheckColor); 
      SolidBrush IndeterminateColorBrush = new SolidBrush(IndeterminateColor); 

      Rectangle CheckRegion = new Rectangle(1, 2, 11, 11); 

      Point[] Points = new Point[16]; 

      Points[0] = new Point(1, 2); 
      Points[1] = new Point(4, 2); 
      Points[2] = new Point(6, 5); 
      Points[3] = new Point(9, 2); 
      Points[4] = new Point(12, 2); 
      Points[5] = new Point(12, 4); 
      Points[6] = new Point(9, 7); 
      Points[7] = new Point(12, 10); 
      Points[8] = new Point(12, 13); 
      Points[9] = new Point(9, 12); 
      Points[10] = new Point(6, 9); 
      Points[11] = new Point(3, 13); 
      Points[12] = new Point(1, 12); 
      Points[13] = new Point(1, 10); 
      Points[14] = new Point(4, 7); 
      Points[15] = new Point(1, 4); 

      base.OnPaint(e); 

      if (CheckState == CheckState.Checked) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.White), CheckRegion); 
       e.Graphics.FillPolygon(CheckColorBrush, Points); 
      } 
      else if (CheckState == CheckState.Indeterminate) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.White), CheckRegion); 
       e.Graphics.FillPolygon(IndeterminateColorBrush, Points); 
      } 
     } 

     /// <summary> 
     /// Gets or Sets the check state. 0 is Unchecked, 1 is Checked, and 2 is Indeterminate 
     /// </summary> 
     public int DBValue 
     { 
      get 
      { 
       switch (CheckState) 
       { 
        case CheckState.Unchecked: 
         return 0; 
        case CheckState.Checked: 
         return 1; 
        case CheckState.Indeterminate: 
         return 2; 
        default: 
         return 3; 
       } 
      } 
      set 
      { 
       switch (value) 
       { 
        case 0: 
         CheckState = CheckState.Unchecked; 
         break; 
        case 1: 
         CheckState = CheckState.Checked; 
         break; 
        case 2: 
         CheckState = CheckState.Indeterminate; 
         break; 
        default: 
         break; 
       } 


      } 

     } 



    } 
} 
+1

Знаете, вы можете использовать код VB в DLL в проекте C#, правильно? – Plutonix

+0

DLL, о которой я добавляю, находится в C#. Я пытаюсь сохранить счетчик DLL до 1, если я могу помочь. Кроме того, я развлекаю идею изучения C++ когда-нибудь, и это поможет мне лучше понять, как работает C# -> C++. Я также хочу изучить WPF, но это комментарий в другой раз. – Kayot

+0

пересмотренный код не избавляет от всего, что он создает. Если вы используете 'new', и у объекта есть метод Dispose, используйте блок' using' – Plutonix

ответ

0

Хорошо, есть два вопроса с кодом:

Point[] Points = new Point[15]; 

должно было быть

Point[] Points = new Point[16]; 

Не знаю почему, но я получаю за пределами поля с 15

Во-вторых, мне пришлось удалить:

ColorCheckBox() 
{ 
    ThreeState = true; 
} 

Опять же, не знаю, почему. Это то, что сработало. Я обновляю код вверху, как только получаю все, что сделано.

+0

Что касается массива точек, то причиной, по которой вам нужно «16», является то, что в C# вы указываете длину, в отличие от VB, где вы указываете верхнюю границу (последний индекс). –

+0

Эти 2 члена кисти должны быть простыми «Цветами», а код краски создает из них кисти. Как и в случае, элемент управления не избавляется от них, если пользователь хочет добавить/удалить их динамически. – Plutonix

+0

@Plutonix Обновлен последний блок кода выше. Я пошел в голову и сделал обмен кистью/цветом. Я думаю, это то, о чем вы говорили. – Kayot

Смежные вопросы