Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы можете настроить сетку свойств, отображаемую при выборе определенного действия в конструкторе, создав широкий интерфейс редактирования. В примере PropertyGridExtensibility показано, как это можно сделать.
Демонстрирует
Расширяемость сетки свойств конструктора рабочих процессов.
Обсуждение
Чтобы расширить сетку свойств, разработчик может настроить встроенный внешний вид редактора сетки свойств или предоставить диалоговое окно, которое отображается для более расширенной области редактирования. В этом примере показаны два разных редактора. встроенный редактор и редактор диалогов.
Встроенный редактор
В примере встроенного редактора демонстрируется следующее:
Создает тип, производный от PropertyValueEditor.
В конструкторе значение InlineEditorTemplate устанавливается, используя шаблон данных Windows Presentation Foundation (WPF). Это может быть привязано к шаблону XAML, но в этом примере код используется для инициализации привязки данных.
Шаблон данных имеет контекст данных для PropertyValue элемента, отображаемого в сетке свойств. Обратите внимание на следующий код (из CustomInlineEditor.cs), что этот контекст затем привязывается к свойству
Value.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);Так как действие и конструктор находятся в одной сборке, регистрация атрибутов конструктора действий выполняется в статическом конструкторе самого действия, как показано в следующем примере из 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()); }
редактор диалоговых окон
В примере редактора диалогов показано следующее:
Создает тип, производный от DialogPropertyValueEditor.
InlineEditorTemplate Задает значение в конструкторе с помощью шаблона данных WPF. Это можно создать в XAML, но в этом примере это создается в коде.
Шаблон данных имеет контекст данных для PropertyValue элемента, отображаемого в сетке свойств. В следующем коде это привязывается к свойству
Value. Важно также вставить EditModeSwitchButton, чтобы обеспечить наличие кнопки, вызывающей диалоговое окно в 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;Переопределяет метод ShowDialog в типе дизайнера для обработки отображения диалогового окна. В этом примере показан базовый 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; } }Так как действие и конструктор находятся в одной сборке, регистрация атрибутов конструктора действий выполняется в статическом конструкторе самого действия, как показано в следующем примере из 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()); }
Настройка, сборка и запуск примера
Создайте решение, а затем откройте Workflow1.xaml.
Перетащите SimpleCodeActivity из панели элементов на рабочую область конструктора.
Щелкните SimpleCodeActivity и откройте сетку свойств, где есть ползунок и элемент управления выбора файла.