У меня есть некоторые пользовательские элементы управления, которые я использовал некоторое время. Несколько дней назад я сделал специальный флажок. Поскольку я не знаю синтаксиса 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;
}
}
}
}
}
Знаете, вы можете использовать код VB в DLL в проекте C#, правильно? – Plutonix
DLL, о которой я добавляю, находится в C#. Я пытаюсь сохранить счетчик DLL до 1, если я могу помочь. Кроме того, я развлекаю идею изучения C++ когда-нибудь, и это поможет мне лучше понять, как работает C# -> C++. Я также хочу изучить WPF, но это комментарий в другой раз. – Kayot
пересмотренный код не избавляет от всего, что он создает. Если вы используете 'new', и у объекта есть метод Dispose, используйте блок' using' – Plutonix