1

Wir haben ein benutzerdefiniertes Panel, das Panel erbt und eine Orientation-Eigenschaft ähnlich der SplitContainer Orientation-Eigenschaft implementiert hat. Für unser benutzerdefiniertes Bedienfeld ist DockStyle.Fill niemals gültig und abhängig vom Wert der Orientierungseigenschaft muss DockStyle für Vertikal oder Oben oder Unten für Horizontal stehen.Wie kann ich Winforms DockStyle Editor Property Grid-Verhalten überschreiben

Die DockStyleEditor-Klasse ist versiegelt, sodass wir sie für unseren eigenen benutzerdefinierten UITypeEditor nicht ableiten können. Gibt es eine Möglichkeit, bestimmte Verhaltensweisen mit einem TypeDescriptor oder auf andere Weise zu überschreiben?

Was möchten wir für unser eigenes Panel DockStyle Editor im Property Grid zu tun ist:
1. deaktivieren Sie entweder die Mitte Fill-Taste oder zeigen Sie es mit dem roten Schrägstrich Kreis, um anzuzeigen, es als Option nicht verfügbar ist
2. Deaktivieren Sie die oben und unten Tasten, wenn die Orientation-Eigenschaft horizontal ist
3. Deaktivieren Sie die Links- und Rechts-Tasten, wenn die Orientation-Eigenschaft ist vertikal

Antwort

2

DockEditor abgedichtet ist, aber Sie können Ihre benutzerdefinierte Dock-Editor basiert auf DockEditor ohne erben es. In Ihrer benutzerdefinierten UITypeEditor können Sie eine Instanz von DockEditor erstellen und mithilfe von Reflection das Editorsteuerelement bearbeiten und dann die Wertbearbeitung mit diesem Steuerelement ausführen.

Die DockEditor verwendet eine DockUI Steuerung, die eine private Klasse ist. Es hat ein Kontrollkästchen für None Schaltfläche und Container-Steuerelement, die Kontrollkästchen für , Top, Left, Right und Bottom enthält. Dann können Sie einfach Enabled, BackColor oder andere Eigenschaften basierend auf Ihrer Logik ändern.

Im folgenden Code werde ich diese Kontrollkästchen Schaltflächen finden und ich werde Fill, Top, Bottom und None deaktivieren. Die einzigen verfügbaren Optionen für den Benutzer wird Left und Right sein:

public class MyDockEditor : UITypeEditor 
{ 
    DockEditor editor; 
    public MyDockEditor() 
    { 
     editor = new System.Windows.Forms.Design.DockEditor(); 
    } 
    public override object EditValue(ITypeDescriptorContext context, 
            IServiceProvider provider, object value) 
    { 
     Type dockUiType = typeof(DockEditor) 
       .GetNestedType("DockUI", BindingFlags.NonPublic); 
     var dockUiConstructor = dockUiType.GetConstructors()[0]; 
     var dockUiField = typeof(DockEditor) 
       .GetField("dockUI", BindingFlags.Instance | BindingFlags.NonPublic); 
     var dockUiObject = dockUiConstructor.Invoke(new[] { editor }) as Control; 
     dockUiField.SetValue(editor, dockUiObject); 
     var container = dockUiObject.Controls[0]; 
     var none = dockUiObject.Controls[1]; 
     var fill= container.Controls[0]; 
     var left= container.Controls[1]; 
     var right= container.Controls[2]; 
     var top = container.Controls[3]; 
     var bottom = container.Controls[4]; 
     none.Enabled = false; 
     fill.Enabled = false; 
     top.Enabled = false; 
     bottom.Enabled = false; 
     return editor.EditValue(context, provider, value); 
    } 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return editor.GetEditStyle(context); 
    } 
} 

es nutzen zu können, reicht es Dock Eigentum Ihrer Kontrolle mit einem Editor Attribut zu schmücken:

[Editor(typeof(MyDockEditor), typeof(UITypeEditor))] 
public override DockStyle Dock 
{ 
    get { return base.Dock; } 
    set { base.Dock = value; } 
} 

Wie Sie unten Bild sehen in , nur links und rechts aktiviert.

enter image description here