Een aangepaste expressie-editor gebruiken
Een aangepaste expressie-editor kan worden geïmplementeerd om een uitgebreidere of eenvoudigere bewerkingservaring voor expressies te bieden. Er zijn verschillende scenario's waarin u mogelijk een aangepaste expressie-editor wilt gebruiken:
Ondersteuning bieden voor IntelliSense en andere uitgebreide bewerkingsfuncties in een opnieuw gehoste werkstroomontwerper. Deze functionaliteit moet worden opgegeven omdat de standaard-Visual Studio-expressie-editor niet kan worden gebruikt in opnieuw gehoste toepassingen.
Om de bewerkingservaring voor expressies voor de gebruikers van bedrijfsanalisten te vereenvoudigen, zodat ze bijvoorbeeld niet vereist zijn om Visual Basic te leren of om te gaan met Visual Basic-expressies.
Er zijn drie basisstappen nodig om een aangepaste expressie-editor te implementeren:
Implementeer de IExpressionEditorService-interface. Deze interface beheert het maken en vernietigen van expressie-editors.
Implementeer de IExpressionEditorInstance-interface. Met deze interface wordt de gebruikersinterface geïmplementeerd voor het bewerken van expressies.
Publiceer de IExpressionEditorService in uw opnieuw gehoste werkstroomtoepassing.
Een aangepaste expressie-editor implementeren in een klassebibliotheek
Hier volgt een voorbeeld van code voor een (proof of concept) MyEditorService
-klasse die de IExpressionEditorService interface implementeert in een MyExpressionEditorService-bibliotheekproject.
using System;
using System.Collections.Generic;
using System.Activities.Presentation.View;
using System.Activities.Presentation.Hosting;
using System.Activities.Presentation.Model;
namespace MyExpressionEditorService
{
public class MyEditorService : IExpressionEditorService
{
public void CloseExpressionEditors()
{
}
public IExpressionEditorInstance CreateExpressionEditor(AssemblyContextControlItem assemblies, ImportedNamespaceContextItem importedNamespaces, List<ModelItem> variables, string text)
{
MyExpressionEditorInstance instance = new MyExpressionEditorInstance();
return instance;
}
public IExpressionEditorInstance CreateExpressionEditor(AssemblyContextControlItem assemblies, ImportedNamespaceContextItem importedNamespaces, List<ModelItem> variables, string text, System.Windows.Size initialSize)
{
MyExpressionEditorInstance instance = new MyExpressionEditorInstance();
return instance;
}
public IExpressionEditorInstance CreateExpressionEditor(AssemblyContextControlItem assemblies, ImportedNamespaceContextItem importedNamespaces, List<ModelItem> variables, string text, Type expressionType)
{
MyExpressionEditorInstance instance = new MyExpressionEditorInstance();
return instance;
}
public IExpressionEditorInstance CreateExpressionEditor(AssemblyContextControlItem assemblies, ImportedNamespaceContextItem importedNamespaces, List<ModelItem> variables, string text, Type expressionType, System.Windows.Size initialSize)
{
MyExpressionEditorInstance instance = new MyExpressionEditorInstance();
return instance;
}
public void UpdateContext(AssemblyContextControlItem assemblies, ImportedNamespaceContextItem importedNamespaces)
{
}
}
}
Hier volgt de code voor een MyExpressionEditorInstance
klasse die de IExpressionEditorInstance interface implementeert in een MyExpressionEditorService-bibliotheekproject.
using System;
using System.Activities.Presentation.View;
using System.Windows;
using System.Reflection;
using System.Windows.Controls;
namespace MyExpressionEditorService
{
public class MyExpressionEditorInstance : IExpressionEditorInstance
{
private TextBox textBox = new TextBox();
public bool AcceptsReturn { get; set; }
public bool AcceptsTab { get; set; }
public bool HasAggregateFocus {
get
{
return true;
}
}
public System.Windows.Controls.ScrollBarVisibility HorizontalScrollBarVisibility { get; set; }
public System.Windows.Controls.Control HostControl {
get
{
return textBox;
}
}
public int MaxLines { get; set; }
public int MinLines { get; set; }
public string Text { get; set; }
public System.Windows.Controls.ScrollBarVisibility VerticalScrollBarVisibility { get; set; }
public event EventHandler Closing;
public event EventHandler GotAggregateFocus;
public event EventHandler LostAggregateFocus;
public event EventHandler TextChanged;
public bool CanCompleteWord()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanCopy()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanCut()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanDecreaseFilterLevel()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanGlobalIntellisense()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanIncreaseFilterLevel()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanParameterInfo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanPaste()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanQuickInfo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanRedo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool CanUndo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public void ClearSelection()
{
MessageBox.Show(MethodBase.GetCurrentMethod().Name);
}
public void Close()
{
MessageBox.Show(MethodBase.GetCurrentMethod().Name);
}
public bool CompleteWord()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool Copy()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool Cut()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool DecreaseFilterLevel()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public void Focus()
{
MessageBox.Show(MethodBase.GetCurrentMethod().Name);
}
public string GetCommittedText()
{
return "CommittedText";
}
public bool GlobalIntellisense()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool IncreaseFilterLevel()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool ParameterInfo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool Paste()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool QuickInfo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool Redo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
public bool Undo()
{
return (MessageBox.Show(MethodBase.GetCurrentMethod().Name, "TestEditorInstance", MessageBoxButton.YesNo) == MessageBoxResult.Yes);
}
}
}
Een aangepaste expressie-editor publiceren in een WPF-project
Hier volgt de code die laat zien hoe u de ontwerpfunctie opnieuw host in een WPF-toepassing en hoe u de MyEditorService
service maakt en publiceert. Voordat u deze code gebruikt, voegt u een verwijzing toe naar het myExpressionEditorService-bibliotheekproject uit het project dat de application
using System.Windows;
using System.Windows.Controls;
using System.Activities.Presentation;
using System.Activities.Statements;
using System.Activities.Core.Presentation;
using System.Activities.Presentation.View;
using MyExpressionEditorService;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private MyEditorService expressionEditorService;
public MainWindow()
{
InitializeComponent();
new DesignerMetadata().Register();
createDesigner();
}
public void createDesigner()
{
WorkflowDesigner designer = new WorkflowDesigner();
Sequence root = new Sequence()
{
Activities = {
new Assign(),
new WriteLine()}
};
designer.Load(root);
Grid.SetColumn(designer.View, 0);
// Create ExpressionEditorService
this.expressionEditorService = new MyEditorService();
// Publish the instance of MyEditorService.
designer.Context.Services.Publish<IExpressionEditorService>(this.expressionEditorService);
MyGrid.Children.Add(designer.View);
}
}
}
Opmerkingen
Als u een expressionTextBox-besturingselement gebruikt in een ontwerpfunctie voor aangepaste activiteiten, is het niet nodig om expressie-editors te maken en te vernietigen met behulp van de CreateExpressionEditor en CloseExpressionEditors methoden van de IExpressionEditorService interface. De ExpressionTextBox klas beheert dit voor u.