Ok, für .net Framework und zur Laufzeit funktioniert der benutzerdefinierte Editor. Für .NET 6 funktioniert dieser nicht, da Mincrosoft für .NET einen neuen Designer geschrieben hat.
Siehe folgenden Link:
https://devblogs.microsoft.com/dotnet/custom-controls-for-winforms-out-of-process-designer/
Werde gucken, dass ich mit dem Template meinen Editor für .NET integrieren kann.
Hallo liebe Community,
seit ein paar Tagen sitze ich nun schon an einem Problem, welches ich nicht verstehe, bzw. nicht gelöst bekomme. Dabei handelt es sich um Code, welcher einen benutzerdefinierten Editor für den Visualisierungs-Programmierer/-Designer über eine Eigenschaft zur Verfügung stellen soll. Jedoch wird nie mein Editor ausgeführt, bzw. aufgerufen (zur Entwurfszeit also wenn ich auf [...] meiner Property von MeinLabel drücke ). Ich arbeite in einem Windows-Forms Projekt innerhalb von Microsoft Visual Studio Professional 2022 Version 17.7.5. Egal wie viele Editoren ich jetzt schon ausprobiert habe, sei es Code aus dem internet oder selbst entwickelter Code. Visual Studio greift immer auf die Standardeditoren zu. Habe ich eventuell etwas falsch gemacht, bzw. etwas nicht richtig verstanden? Muss ich eventuell doch eine Erweiterung schreiben? Das sich öffnende Fenster füge ich als .jpg hinzu.
Code:
namespace CustomCollectionEditor.Enumerations;
public enum ATTRIBUT
{
XPOS = 0,
YPOS = 1,
WIDTH = 2,
HEIGHT = 3,
NAME = 4,
TEXT = 5
}
namespace CustomCollectionEditor.AttributeConfiguration;
public class CustomAttributeConfiguration
{
private string _clientName = string.Empty;
private string _keyName = string.Empty;
private int _keyValue;
[Category("Konfiguration des Attributs")]
[DisplayName("Clientname")]
[Description("Geben Sie den Namen des ZielClients an")]
public string ClientName
{
get { return _clientName; }
set { _clientName = value; }
}
[Category("Konfiguration des Attributs")]
[DisplayName("KEY-Name")]
[Description("Geben Sie den Namen des KEYs an")]
public string KeyName
{
get { return _keyName; }
set { _keyName = value; }
}
[Category("Konfiguration des Attributs")]
[DisplayName("KEY-Wert")]
[Description("Geben Sie an welcher Wert vom Key für das Attribut verwendet werden soll")]
public int KeyValue
{
get { return _keyValue; }
set { _keyValue = value; }
}
}
using CustomCollectionEditor.Enumerations;
using CustomCollectionEditor.AttributeConfiguration;
namespace CustomCollectionEditor.AttributeCollection;
public class CustomAttributeCollection : Dictionary<ATTRIBUT, CustomAttributeConfiguration>, ISerializable
{
public void AddAttribute(ATTRIBUT key, CustomAttributeConfiguration configuration)
{
this[key] = configuration;
}
public bool RemoveAttribute(ATTRIBUT key)
{
return Remove(key);
}
}
using CustomCollectionEditor.AttributeCollection;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing.Design;
using System.Windows.Forms.Design;
namespace CustomCollectionEditor.Organization;
public class CustomAttributeCollectionEditor : UITypeEditor
{
private IWindowsFormsEditorService? _editorService;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (provider != null)
{
_editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
if (_editorService != null)
{
if (value is CustomAttributeCollection attributeCollection)
{
CustomCollectionEditorWindow editorForm = new CustomCollectionEditorWindow(attributeCollection);
if (_editorService.ShowDialog(editorForm) == DialogResult.OK)
{
return editorForm.AttributeCollection;
}
}
}
}
return value;
}
}
using CustomCollectionEditor.AttributeCollection;
using CustomCollectionEditor.AttributeConfiguration;
using CustomCollectionEditor.Enumerations;
using CustomCollectionEditor.Organization;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms.Design;
using Test.CustomConverter;
namespace Test
{
internal class MeinLabel : Label
{
private CustomAttributeCollection? _irgendeineEigenschaft;
[Category("Benutzerdefiniertes Attribut")]
[Description("Benutzerdefiniertes Attribut zum hinzufügen von elementen")]
[DisplayName("Own Collection")]
[Editor(typeof(CustomAttributeCollectionEditor), typeof(UITypeEditor))]
public CustomAttributeCollection IrgendeineEigenschaft
{
get
{
if (_irgendeineEigenschaft != null)
{
return _irgendeineEigenschaft;
}
return null;
}
set { _irgendeineEigenschaft = value; }
}
}
}