Dela via


Utökningsbarhet för egenskapsrutnät

Du kan anpassa det egenskapsrutnät som visas när en viss aktivitet väljs i designern, vilket skapar en omfattande redigeringsupplevelse. Exemplet PropertyGridExtensibility visar hur detta kan göras.

Demonstrationer

Utökningsbarhet för egenskapsrutnät för arbetsflödesdesignern.

Diskussion

För att utöka egenskapsrutnätet har en utvecklare alternativ för att anpassa inline-utseendet på en redigerare för egenskapsrutnät eller tillhandahålla en dialogruta som visas för en mer avancerad redigeringsyta. Det finns två olika redigerare som visas i det här exemplet. en infogad redigerare och en dialogredigerare.

Infogad redigerare

Exempel på infogad redigerare visar följande:

  • Skapar en typ som härleds från PropertyValueEditor.

  • I konstruktorn InlineEditorTemplate anges värdet med en WPF-datamall (Windows Presentation Foundation). Detta kan bindas till en XAML-mall, men i det här exemplet används kod för att initiera databindning.

  • Datamallen har en datakontext för PropertyValue objektet som återges i egenskapsrutnätet. Observera i följande kod (från CustomInlineEditor.cs) att den här kontexten Value sedan binder till egenskapen.

    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);
    
  • Eftersom aktiviteten och designern finns i samma sammansättning utförs registreringen av aktivitetsdesignerattributen i själva aktivitetens statiska konstruktor, som du ser i följande exempel från SimpleCodeActivity.cs.

    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());
    }
    

Dialogredigeraren

Exemplet på dialogredigeraren visar följande:

  1. Skapar en typ som härleds från DialogPropertyValueEditor.

  2. InlineEditorTemplate Anger värdet i konstruktorn med en WPF-datamall. Detta kan skapas i XAML, men i det här exemplet skapas detta i kod.

  3. Datamallen har en datakontext för PropertyValue objektet som återges i egenskapsrutnätet. I följande kod binder detta sedan till egenskapen Value . Det är viktigt att även inkludera en EditModeSwitchButton för att ange knappen som höjer dialogrutan i FilePickerEditor.cs.

    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;
    
  4. Åsidosätter ShowDialog metoden i designertypen för att hantera visningen av dialogrutan. I det här exemplet visas en grundläggande FileDialog .

    public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource)
    {
        Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
        if (ofd.ShowDialog() == true)
        {
            propertyValue.Value = ofd.FileName;
        }
    }
    
  5. Eftersom aktiviteten och designern finns i samma sammansättning utförs registreringen av aktivitetsdesignerattributen i själva aktivitetens statiska konstruktor, som du ser i följande exempel från SimpleCodeActivity.cs.

    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());
    }
    

Så här konfigurerar du, skapar och kör exemplet

  1. Skapa lösningen och öppna sedan Workflow1.xaml.

  2. Dra en SimpleCodeActivity från verktygslådan till designerarbetsytan.

  3. Klicka på SimpleCodeActivity och öppna sedan egenskapsrutnätet där det finns en skjutreglagekontroll och en filplockningskontroll.