Поделиться через


Перемещение дизайнера

Рехостинг конструктора — это распространенный сценарий, который относится к размещению холста конструктора рабочего процесса в пользовательском приложении. Большинство пользователей приложения размещения знакомы с Visual Studio, однако существует ряд сценариев, в которых может быть полезно показать конструктор рабочих процессов в приложении:

  • Мониторинг приложений (позволяя конечным пользователям визуализировать процесс, а также данные среды выполнения о процессе, такие как активное состояние, статистические данные времени выполнения или другие сведения об экземпляре рабочего процесса).

  • Приложения, позволяющие пользователю настраивать процесс с ограниченным набором действий.

Для поддержки этих типов приложений конструктор рабочих процессов поставляется в .NET Framework и может размещаться в приложении WPF или в приложении WinForms с соответствующим кодом размещения WPF. Пример DesignerRehosting демонстрирует:

  • Повторное размещение конструктора Workflow Foundation (WF).

  • Использование повторно размещенной панели элементов и сетки свойств.

Повторное размещение дизайнера

В этом примере показано, как создать макет WPF для размещения дизайнерского элемента, показанного в следующей сетке макета (код панели инструментов опущен из-за ограничений по месту). Обратите внимание на именование границ, содержащих сетку конструктора и свойств.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="7*"/>
        <ColumnDefinition Width="3*"/>
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0">
        <sapt:ToolboxControl>...</sapt:ToolboxControl>
    </Border>
    <Border Grid.Column="1" Name="DesignerBorder"/>
    <Border Grid.Column="2" Name="PropertyBorder"/>
</Grid>

Следующий пример создает конструктор и связывает его основные элементы View и PropertyInspectorView с соответствующим контейнером в пользовательском интерфейсе. В следующем примере есть несколько дополнительных строк кода, которые заслуживают некоторых объяснений. Вызов Register требуется для привязки типовых конструкторов действий к действиям, входящим в состав .NET Framework. Load вызывается для передачи элемента WF для изменения. Наконец, View (основной холст) и PropertyInspectorView (сетка свойств) помещаются на поверхность пользовательского интерфейса.

protected override void OnInitialized(EventArgs e)
{
   base.OnInitialized(e);
   // register metadata
   (new DesignerMetadata()).Register();

   // create the workflow designer
   WorkflowDesigner wd = new WorkflowDesigner();
   wd.Load(new Sequence());
   DesignerBorder.Child = wd.View;
   PropertyBorder.Child = wd.PropertyInspectorView;
}

Использование повторно размещенной панели элементов

Этот пример декларативно использует в XAML повторно размещённый элемент управления из панели инструментов. Обратите внимание, что в коде можно передать тип конструктору ToolboxItemWrapper .

<!-- Copyright (c) Microsoft Corporation. All rights reserved-->
<Window x:Class="Microsoft.Samples.DesignerRehosting.RehostingWfDesigner"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sapt="clr-namespace:System.Activities.Presentation.Toolbox;assembly=System.Activities.Presentation"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="Window1" Height="600" Width="900">
    <Window.Resources>
        <sys:String x:Key="AssemblyName">System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</sys:String>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="7*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0">
            <sapt:ToolboxControl>
                <sapt:ToolboxCategory CategoryName="Basic">
                    <sapt:ToolboxItemWrapper AssemblyName="{StaticResource AssemblyName}" >
                        <sapt:ToolboxItemWrapper.ToolName>
                            System.Activities.Statements.Sequence
                        </sapt:ToolboxItemWrapper.ToolName>
                       </sapt:ToolboxItemWrapper>
                    <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                        <sapt:ToolboxItemWrapper.ToolName>
                            System.Activities.Statements.WriteLine
                        </sapt:ToolboxItemWrapper.ToolName>

                    </sapt:ToolboxItemWrapper>
                    <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                        <sapt:ToolboxItemWrapper.ToolName>
                            System.Activities.Statements.If
                        </sapt:ToolboxItemWrapper.ToolName>

                    </sapt:ToolboxItemWrapper>
                    <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                        <sapt:ToolboxItemWrapper.ToolName>
                            System.Activities.Statements.While
                        </sapt:ToolboxItemWrapper.ToolName>

                    </sapt:ToolboxItemWrapper>
                </sapt:ToolboxCategory>
            </sapt:ToolboxControl>
        </Border>
        <Border Grid.Column="1" Name="DesignerBorder"/>
        <Border Grid.Column="2" Name="PropertyBorder"/>
    </Grid>
</Window>

Использование примера

  1. Откройте решение DesignerRehosting.sln в Visual Studio.

  2. Нажмите клавишу F5, чтобы скомпилировать и запустить приложение.

  3. Приложение WPF начинается с повторно размещенного конструктора.