Erweiterbarkeit von Eigenschaftenrastern
Sie können das Eigenschaftenraster anpassen, das angezeigt wird, wenn eine bestimmte Aktivität im Designer ausgewählt wird, wodurch eine umfangreiche Bearbeitungserfahrung entsteht. Das PropertyGridExtensibility-Beispiel zeigt, wie dies möglich ist.
Zeigt
Erweiterbarkeit des Eigenschaftenrasters im Workflow-Designer.
Diskussion (Discussion)
Zur Erweiterung des Eigenschaftenrasters stehen Entwicklern Optionen zur Verfügung, mit denen sie die Darstellung des Eigenschaftenraster-Editors anpassen oder ein Dialogfeld bereitstellen können, das für eine erweiterte Entwurfsoberfläche angezeigt wird. In diesem Beispiel werden zwei verschiedene Editoren veranschaulicht, ein Inline-Editor und ein Dialog-Editor.
Inline-Editor
Das Beispiel zum Inline-Editor veranschaulicht Folgendes:
Ein von PropertyValueEditor abgeleiteter Typ wird erstellt.
Im Konstruktor wird der InlineEditorTemplate Wert mit einer WPF-Datenvorlage (Windows Presentation Foundation) festgelegt. Diese kann an eine XAML-Vorlage gebunden werden, in diesem Beispiel wird jedoch Code zur Initialisierung der Datenbindung verwendet.
Die Datenvorlage weist einen Datenkontext für den PropertyValue-Wert des im Eigenschaftenraster gerenderten Elements auf. Beachten Sie beim folgenden Code (aus der Datei "CustomInlineEditor.cs"), dass dieser Kontext dann an die
Value
-Eigenschaft gebunden wird.FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); FrameworkElementFactory slider = new FrameworkElementFactory(typeof(Slider)); Binding sliderBinding = new Binding("Value"); sliderBinding.Mode = BindingMode.TwoWay; slider.SetValue(Slider.MinimumProperty, 0.0); slider.SetValue(Slider.MaximumProperty, 100.0); slider.SetValue(Slider.ValueProperty, sliderBinding); stack.AppendChild(slider);
Da die Aktivität und der Designer sich in derselben Assembly befinden, erfolgt die Registrierung der Aktivitätsdesignerattribute im statischen Konstruktor der Aktivität, wie im folgenden Beispiel aus der Datei „SimpleCodeActivity.cs“ gezeigt.
static SimpleCodeActivity() { AttributeTableBuilder builder = new AttributeTableBuilder(); builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor))); builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor))); MetadataStore.AddAttributeTable(builder.CreateTable()); }
Dialog-Editor
Das Beispiel zum Dialog-Editor veranschaulicht Folgendes:
Ein von DialogPropertyValueEditor abgeleiteter Typ wird erstellt.
Der InlineEditorTemplate-Wert im Konstruktor wird mit einer WPF-Datenvorlage festgelegt. Diese kann in XAML erstellt werden, in diesem Beispiel wird jedoch Code verwendet.
Die Datenvorlage weist einen Datenkontext für den PropertyValue-Wert des im Eigenschaftenraster gerenderten Elements auf. Im folgenden Code wird dieser dann an die
Value
-Eigenschaft gebunden. Es muss auch ein EditModeSwitchButton-Element eingebunden werden, um die Schaltfläche bereitzustellen, mit der das Dialogfeld in "FilePickerEditor.cs" ausgelöst wird.this.InlineEditorTemplate = new DataTemplate(); FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); stack.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); FrameworkElementFactory label = new FrameworkElementFactory(typeof(Label)); Binding labelBinding = new Binding("Value"); label.SetValue(Label.ContentProperty, labelBinding); label.SetValue(Label.MaxWidthProperty, 90.0); stack.AppendChild(label); FrameworkElementFactory editModeSwitch = new FrameworkElementFactory(typeof(EditModeSwitchButton)); editModeSwitch.SetValue(EditModeSwitchButton.TargetEditModeProperty, PropertyContainerEditMode.Dialog); stack.AppendChild(editModeSwitch); this.InlineEditorTemplate.VisualTree = stack;
Überschreibt die ShowDialog-Methode im Designertyp zur Behandlung der Dialogfeldanzeige. In diesem Beispiel wird ein einfaches FileDialog gezeigt.
public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource) { Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); if (ofd.ShowDialog() == true) { propertyValue.Value = ofd.FileName; } }
Da die Aktivität und der Designer sich in derselben Assembly befinden, erfolgt die Registrierung der Aktivitätsdesignerattribute im statischen Konstruktor der Aktivität, wie im folgenden Beispiel aus der Datei „SimpleCodeActivity.cs“ gezeigt.
static SimpleCodeActivity() { AttributeTableBuilder builder = new AttributeTableBuilder(); builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor))); builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor))); MetadataStore.AddAttributeTable(builder.CreateTable()); }
So können Sie das Beispiel einrichten, erstellen und ausführen
Erstellen Sie die Projektmappe, und öffnen Sie dann "Workflow1.xaml".
Ziehen Sie ein SimpleCodeActivityvon der Toolbox auf den Designerzeichnungsbereich.
Klicken Sie auf das SimpleCodeActivity, und öffnen Sie dann das Eigenschaftenraster, das ein Schieberegler-Steuerelement und ein Dateiauswahl-Steuerelement enthält.