У меня есть некоторые пользовательские элементы управления, которые я использую некоторое время. Несколько дней назад я сделал пользовательский флажок. Поскольку я не очень хорошо знаю синтаксис C#, я сделал это на VB.NET. Проблема в том, что большинство бесплатных пользовательских элементов управления в Интернете написаны на C#. Мое решение состояло в том, чтобы скомпилировать их в DLL и использовать в своих приложениях.
Я пошел дальше и преобразовал это в 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;
}
}
}
}
}
Colors
, и код рисования создает из них кисти. Как есть, элемент управления не избавляется от них, если пользователь хочет добавить/удалить их динамически. 10.03.2016