Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Editor ekspresi kustom dapat diimplementasikan untuk memberikan pengalaman pengeditan ekspresi yang lebih kaya atau lebih mudah. Ada beberapa skenario di mana Anda mungkin ingin menggunakan editor ekspresi kustom:
Untuk memberikan dukungan untuk IntelliSense dan fitur pengeditan kaya lainnya dalam perancang alur kerja yang di-host ulang. Fungsionalitas ini harus disediakan karena editor ekspresi Visual Studio default tidak dapat digunakan dalam aplikasi yang di-host ulang.
Untuk menyederhanakan pengalaman pengeditan ekspresi bagi pengguna analis bisnis sehingga, misalnya, tidak perlu mempelajari Visual Basic atau berurusan dengan ekspresi Visual Basic.
Tiga langkah dasar diperlukan untuk mengimplementasikan editor ekspresi kustom:
Implementasikan IExpressionEditorService antarmuka. Antarmuka ini mengelola pembuatan dan penghancuran editor ekspresi.
Implementasikan IExpressionEditorInstance antarmuka. Antarmuka ini mengimplementasikan UI untuk antarmuka pengguna pengeditan ekspresi.
Terbitkan IExpressionEditorService di aplikasi alur kerja yang di-host ulang.
Menerapkan Editor Ekspresi Kustom di Pustaka Kelas
Berikut sampel kode untuk kelas MyEditorService (bukti konsep) yang mengimplementasikan antarmuka IExpressionEditorService terkandung dalam proyek pustaka MyExpressionEditorService.
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)
{
}
}
}
Berikut kode untuk kelas MyExpressionEditorInstance yang mengimplementasikan antarmuka IExpressionEditorInstance dalam proyek pustaka MyExpressionEditorService.
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);
}
}
}
Menerbitkan Editor Ekspresi Kustom di Project WPF
Berikut kode yang menunjukkan cara meng-host ulang perancang dalam aplikasi WPF dan cara membuat dan menerbitkan layanan MyEditorService. Sebelum menggunakan kode ini, tambahkan referensi ke proyek pustaka MyExpressionEditorService dari proyek yang berisi aplikasi avalon2.
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);
}
}
}
Catatan
Jika menggunakan kontrol ExpressionTextBox dalam perancang aktivitas kustom, Anda tidak perlu membuat dan menghancurkan editor ekspresi menggunakan metode CreateExpressionEditor dan CloseExpressionEditors dari antarmuka IExpressionEditorService. Kelas ExpressionTextBox mengelolanya untuk Anda.