标准DevExpress服务
DevExpress Services将ViewModel中的命令传递给View中的控件,这允许您在不分离应用层的情况下修改UI。
可用服务
- MessageBoxService
- DialogService
- Current Dialog Service
- CurrentWindowService
- Window Service
- DocumentManagerService
- WindowedDocumentManagerService
- NavigationService
- DispatcherService
- Notification Service
- SplashScreen Service
- Open and Save File Dialog Services
- Folder Browser Dialog Service
附加信息
- 如何使用服务
- 如何使用服务扩展方法
如何使用服务
1.注册服务。
- 本地注册(服务仅在视图中可用):调用mvvmContext1.RegisterService方法并将 Service 的Create方法之一作为参数传递。DevExpress MVVM 框架自动注册最常用的服务——请参阅下面“全局注册”部分中的注释。
- 全局注册(服务可用于整个应用程序):调用相应的静态MVVMContext.Register…服务方法。
- 定义一个ViewModel属性,返回一个相关Service接口的对象(例如,如果注册了WindowedDocumentManagerService,您的属性应该是IDocumentManagerService类型)。
- 使用此属性可访问服务并调用服务方法向视图发送命令。
示例
C#:
//1. Global registration MVVMContext.RegisterMessageBoxService(); //1. Local registration mvvmContext1.RegisterService(CreateXtraMessageBoxService()); //2. POCO ViewModel property that returns a Service protected virtual IMessageBoxService MessageBoxService { get { throw new System.NotImplementedException(); } } //3. Send a Service command to a View public void SayHello() { MessageBoxService.Show("Hello!"); }
VB.NET:
'1. Global registration MVVMContext.RegisterMessageBoxService() '1. Local registration mvvmContext1.RegisterService(CreateXtraMessageBoxService()) '2. POCO ViewModel property that returns a Service protected virtual IMessageBoxService MessageBoxService Get Throw New System.NotImplementedException() End Get '3. Send a Service command to a View public void SayHello() MessageBoxService.Show("Hello!")
MessageBoxService
允许您显示消息框和弹出框。
接口
- IMessageBoxService
管理控件
- System.Windows.Forms.MessageBox
- XtraMessageBox
- FlyoutDialog
Global Registration
C#:
MVVMContext.RegisterMessageBoxService(); MVVMContext.RegisterXtraMessageBoxService(); MVVMContext.RegisterFlyoutMessageBoxService();
VB.NET:
MVVMContext.RegisterMessageBoxService() MVVMContext.RegisterXtraMessageBoxService() MVVMContext.RegisterFlyoutMessageBoxService()
DevExpress MVVM框架自动调用RegisterXtraMessageBoxService方法。
Local Registration
C#:
mvvmContext1.RegisterService( //one of "Create" methods from the list below );
VB.NET:
mvvmContext1.RegisterService( 'one of "Create" methods from the list below )
Create()方法
- Create(DefaultMessageBoxServiceType type) ——使用DefaultMessageBoxServiceType枚举值来确定要创建的服务类型。
- CreateMessageBoxService() ——创建一个使用标准WinForms消息框的Service。
- CreateXtraMessageBoxService() ——创建一个使用DevExpress XtraMessageBox对象的Service。
- CreateFlyoutMessageBoxService() ——创建一个使用FlyoutDialog对象的服务。
所有四个方法都有对应的重载与第二个IWin32Window所有者参数,此参数允许指定拥有此服务的视图。如果您传递的是null而不是owner参数,框架将尝试找到一个应该是Service所有者的适当视图并在大多数情况下使用活动窗口。
Public Service Members
- ShowMessage ——五个显示消息框的扩展方法。
- MessageBoxFormStyle——允许您访问消息框表单并修改其外观设置。例如,下面的代码说明了如何将粗体字体样式应用于消息框按钮。
C#:
var msgService = MessageBoxService.CreateFlyoutMessageBoxService(); msgService.MessageBoxFormStyle = (form) => { { FlyoutDialog msgFrm = form as FlyoutDialog; msgFrm.Properties.AppearanceButtons.FontStyleDelta = FontStyle.Bold; };
VB.NET:
Dim msgService = MessageBoxService.CreateFlyoutMessageBoxService(Me) msgService.DialogFormStyle = Sub(form) Dim msgFrm As FlyoutDialog = TryCast(form, FlyoutDialog) msgFrm.Properties.AppearanceButtons.FontStyleDelta = FontStyle.Bold End Sub
DialogService
允许您显示对话框。
接口
IDialogService
管理控件
- XtraForm
- FlyoutDialog
- RibbonForm
Global Registration
C#:
MVVMContext.RegisterXtraDialogService(); MVVMContext.RegisterFlyoutDialogService(); MVVMContext.RegisterRibbonDialogService();
VB.NET:
MVVMContext.RegisterXtraDialogService() MVVMContext.RegisterFlyoutDialogService() MVVMContext.RegisterRibbonDialogService()
DevExpress MVVM框架自动调用RegisterXtraDialogService方法。
Local Registration
C#:
mvvmContext1.RegisterService(DialogService.CreateXtraDialogService(this)); mvvmContext1.RegisterService(DialogService.CreateFlyoutDialogService(this)); mvvmContext1.RegisterService(DialogService.CreateRibbonDialogService(this)); mvvmContext1.RegisterService(DialogService.Create(this, DefaultDialogServiceType.RibbonDialog));
VB.NET:
mvvmContext1.RegisterService(DialogService.CreateXtraDialogService(Me)) mvvmContext1.RegisterService(DialogService.CreateFlyoutDialogService(Me)) mvvmContext1.RegisterService(DialogService.CreateRibbonDialogService(Me)) mvvmContext1.RegisterService(DialogService.Create(Me, DefaultDialogServiceType.RibbonDialog))
Create()方法
DialogService的所有' Create…'方法都需要一个拥有该服务的视图。如果传递的是null而不是View,框架会尝试找到一个合适的窗口(在大多数情况下,会使用活动窗口)。
- Create(IWin32Window owner, DefaultDialogServiceType type) ——使用DefaultDialogServiceType枚举值来确定要创建的服务类型。
- CreateXtraDialogService(IWin32Window所有者)——创建一个显示可剥皮DevExpress对话框的服务。
- CreateFlyoutDialogService(IWin32Window所有者)——创建一个显示flyoutdialog的服务。
- CreateRibbonDialogService(IWin32Windowowner)——创建一个服务,将带有嵌入式RibbonControl的RibbonForm显示为对话框,对话框按钮显示为功能区项目。
- Create(IWin32Window owner, string title, Func<IDialogForm> factoryMethod)——允许您注册一个Service来管理自定义对话框(实现IDialogForm接口的对象)。
C#:
DialogService.Create(ownerView1, "A custom dialog", ()=> new CustomDialogClass());
VB.NET:
DialogService.Create(ownerView1, "A custom dialog", Function() New CustomDialogClass())
- DialogService Create(IWin32Windowowner, string title, IDialogFormFactoryfactory)——接受创建自定义对话框的工厂类。
Public Service Methods
ShowDialog——六种扩展方法,显示具有特定外观和内容的对话框。
C#:
public void FindCustomer() { if(DialogService.ShowDialog(MessageButton.OKCancel, "Find Customer", findDialogViewModel) == MessageResult.OK) { // do something } }
VB.NET:
Public Sub FindCustomer() If DialogService.ShowDialog(MessageButton.OKCancel, "Find Customer", findDialogViewModel) = MessageResult.OK Then ' do something End If End Sub
这些重载允许您用自定义UICommand对象替换默认对话框按钮。为此,使用自定义命令的Id或Tag属性作为MessageResult或DialogResult值。
C#:
public void FindCustomer() { var findDialogViewModel = FindDialogViewModel.Create(); findDialogViewModel.SetParentViewModel(this); var commands = new List<UICommand> { // Button with custom command attached new UICommand { Id = "Find", Caption = "Find", Command = new DelegateCommand(() =>{ // . . . implement the Find command here }), IsDefault = true, IsCancel = false, Tag = DialogResult.OK }, // standard button caption customization new UICommand { Caption = "Cancel Find", Tag = DialogResult.Cancel } }; DialogService.ShowDialog(commands, "Find Customer", "FindDialogView", SelectedEntity, findDialogViewModel); }
VB.NET:
Public Sub FindCustomer() Dim findDialogViewModel = FindDialogViewModel.Create() findDialogViewModel.SetParentViewModel(Me) Dim commands = New List(Of UICommand) From {New UICommand With {.Id = "Find", .Caption = "Find", .Command = New DelegateCommand(Sub() End Sub), .IsDefault = True, .IsCancel = False, .Tag = DialogResult.OK }, New UICommand With {.Caption = "Cancel Find", .Tag = DialogResult.Cancel} } DialogService.ShowDialog(commands, "Find Customer", "FindDialogView", SelectedEntity, findDialogViewModel) End Sub
DialogFormStyle——允许您访问对话框并修改其外观设置。例如,下面的代码说明了如何将粗体字体样式应用于弹出对话框按钮。
C#:
var service = DialogService.CreateFlyoutDialogService(this); service.DialogFormStyle = (form) => { FlyoutDialog dialog = form as FlyoutDialog; dialog.Properties.AppearanceButtons.FontStyleDelta = FontStyle.Bold; };
VB.NET:
Dim service = DialogService.CreateFlyoutDialogService(Me) service.DialogFormStyle = Sub(form) Dim dialog As FlyoutDialog = TryCast(form, FlyoutDialog) dialog.Properties.AppearanceButtons.FontStyleDelta = FontStyle.Bold End Sub
当前对话服务
允许您管理当前可见的对话框。
接口
DevExpress.Mvvm.ICurrentDialogService
注册
服务只有在有活动对话框时才存在——您不能注册CurrentDialogService。
Create()方法
没有
Public Service Methods
- Close()、Close(MessageResultdialogResult)和Close (UICommanddialogResult) —— 使用给定的DialogResult关闭对话框,如果结果是UICommand类型,则调用相关的UICommand 。请注意,您只能使用最初传递到该方法中的对话框服务的UICommand之一ShowDialog。
- WindowState——这个属性允许您改变对话框的窗口状态(正常,最小化或最大化)。
当前窗口服务
类似于CurrentDialogService,但是允许您管理当前的应用程序窗口(形式)。
接口
DevExpress.Mvvm.ICurrentWindowService
Global Registration
不可用。
Local Registration
C#:
mvvmContext1.RegisterService(CurrentWindowService.Create(this)); mvvmContext1.RegisterService(CurrentWindowService.Create(listBoxControl1));
VB.NET:
mvvmContext1.RegisterService(CurrentWindowService.Create(Me)) mvvmContext1.RegisterService(CurrentWindowService.Create(listBoxControl1))
Create()方法
- Create(控制容器)——允许您为任何承载作为方法参数分配的控件的表单注册服务。
- 创建(Form currentForm)——为这个表单注册一个服务。
- Create(Func<Form> getCurrentForm)——为getCurrentForm方法返回的任何表单注册一个Service。
公共服务API
Activate()、Close()、Hide()和Show() ——允许您控制当前窗口的可见性。
WindowState ——此属性允许您更改窗体的窗口状态(正常、最小化或最大化)。
窗口服务
允许您将视图显示为独立的窗口(形式),并从ViewModel层管理这些窗口。
接口
IWindowService
管理控件
- XtraForm
- RibbonForm
- FlyoutPanel
Global Registration
C#:
MVVMContext.RegisterXtraFormService(); MVVMContext.RegisterFlyoutWindowService(); MVVMContext.RegisterRibbonWindowService();
VB.NET:
MVVMContext.RegisterXtraFormService() MVVMContext.RegisterFlyoutWindowService() MVVMContext.RegisterRibbonWindowService()
Local Registration
C#:
mvvmContext1.RegisterService(WindowService.Create(this, DefaultWindowServiceType.RibbonForm, "Window Title")); mvvmContext1.RegisterService(WindowService.CreateXtraFormService(this, "Window Title")); mvvmContext1.RegisterService(WindowService.CreateRibbonWindowService(this, "Window Title")); mvvmContext1.RegisterService(WindowService.CreateFlyoutWindowService(this, "Window Title"));
VB.NET:
mvvmContext1.RegisterService(WindowService.Create(Me, DefaultWindowServiceType.RibbonForm, "Window Title")) mvvmContext1.RegisterService(WindowService.CreateXtraFormService(Me, "Window Title")) mvvmContext1.RegisterService(WindowService.CreateRibbonWindowService(Me, "Window Title")) mvvmContext1.RegisterService(WindowService.CreateFlyoutWindowService(Me, "Window Title"))
本地注册(模态窗口)
如果您想把表单显示为模态对话框请在注册前修改Service的ShowMode属性。
C#:
var service = WindowService.CreateXtraFormService(this, "Window Title"); service.ShowMode = WindowService.WindowShowMode.Modal; mvvmContext1.RegisterService(service);
VB.NET:
Dim service = WindowService.CreateXtraFormService(Me, "Window Title") service.ShowMode = WindowService.WindowShowMode.Modal mvvmContext1.RegisterService(service)
Create()方法
CreateXtraFormService(IWin32Window owner, string title = null)——创建一个管理xtraform的服务。
CreateRibbonWindowService(IWin32Window owner, string title = null)——创建一个管理Ribbon窗体的服务。
CreateFlyoutWindowService(IWin32Window owner, string title = null)——创建一个管理Flyouts的服务。
Create(IWin32Window owner, DefaultWindowServiceType type, string title = null)——创建一个Service,其类型取决于type参数。
Create(IWin32Window owner, string title = null, Func<IWindow> factoryMethod = null) ——允许注册一个服务来管理自定义表单(实现IWindowFactory接口的对象)。
Create(IWin32Window owner, string title = null, IWindowFactory factory = null)——接受一个创建自定义窗口的工厂类。
公共服务方式
- Show(object viewModel)——显示与此 ViewModel 关联的视图。
- Show(string documentType, object viewModel)——显示由目标 ViewModel 管理的特定视图。
- Show(string documentType, objectparameter, objectparentViewModel)——允许您将特定参数传递到表单。
- Hide()和Activate()——允许您最小化表单或将其置于最前面。
- Close()——关闭窗口管理。
DocumentManagerService
提供在MDI(多文档接口)控件中创建和管理选项卡的方法的本地服务。
接口
IDocumentManagerService
管理控件
- DocumentManager
- Navigation Frame
- XtraTabControl
- XtraTabbedMdiManager
- Dock Manager
- TabFormControl
Global Registration
由于该服务管理特定的内容提供程序,因此您无法全局注册该服务。
Local Registration
C#:
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1));
VB.NET:
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1))
Create()方法
- Create(IDocumentAdapterFactory factory)——创建一个控制特定提供者的服务,提供程序是类的控件或对象,派生自IDocumentAdapterFactory接口。factory参数接受以下类型的对象:
- 所有
- 选项卡MDI管理器
- XtraTabControl
- 导航框架
- Dock Manager
- TabFormControl
- Create(Func<IDocumentAdapter> factoryMethod)——接受一个初始化新工厂对象的factoryMethod函数,这允许您创建自定义工厂(实现IDocumentAdapterFactory接口的对象)。
Global Registration
由于该服务管理特定的内容提供程序,因此您无法全局注册该服务。
Local Registration
C#:
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1));
VB.NET:
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1))
Create()方法
- Create(IDocumentAdapterFactory factory)——创建一个控制特定提供者的服务,提供程序是类的控件或对象,派生自IDocumentAdapterFactory接口。factory参数接受以下类型的对象:
- 所有DocumentManager视图
- 选项卡MDI管理器
- XtraTabControl
- 导航框架
- Dock Manager
- TabFormControl
- Create(Func<IDocumentAdapter> factoryMethod)——接受一个初始化新工厂对象的factoryMethod函数,这允许您创建自定义工厂(实现IDocumentAdapterFactory接口的对象)。
公共服务方式
- Documents——提供对托管内容提供者拥有的项(文档、选项卡、页面)集合的访问的属性。
- ActiveDocument——获得或设置一个活跃的项目。
- CreateDocument——创建该内容提供商拥有的新项目的三种扩展方法。创建的项目的类型取决于提供者类型。对于TabbedView、NativeMdiView视图和XtraTabbedMdiManager控件,CreateDocument方法创建一个项目,作为选项卡停靠到提供程序。为了创建浮动项,请改用 WindowedDocumentManagerService (见下文)。
窗口文档管理器服务
允许您添加承载自定义内容的新表单。如果服务是用Create(IDocumentAdapterFactory factory)方法注册的,它会添加新的浮动DocumentManager/XtraTabbedMdiManager面板而不是表单。
接口
IDocumentManagerService
管理控件
- System.Windows.Forms.Form
- XtraForm
- RibbonForm
- FlyoutDialog
Global Registration
C#:
MVVMContext.RegisterFormWindowedDocumentManagerService(); MVVMContext.RegisterXtraFormWindowedDocumentManagerService(); MVVMContext.RegisterRibbonFormWindowedDocumentManagerService();
VB.NET:
MVVMContext.RegisterFormWindowedDocumentManagerService() MVVMContext.RegisterXtraFormWindowedDocumentManagerService() MVVMContext.RegisterRibbonFormWindowedDocumentManagerService()
DevExpress MVVM框架自动调用XtraFormWindowedDocumentManagerService方法。
Local Registration
C#:
mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(this)); mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateXtraFormService()); mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateRibbbonFormService()); mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateFlyoutFormService()); mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(this, DefaultWindowedDocumentManagerServiceType.RibbonForm)); mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1));
VB.NET:
mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(Me)) mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateXtraFormService()) mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateRibbbonFormService()) mvvmContext1.RegisterService(WindowedDocumentManagerService.CreateFlyoutFormService()) mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(Me, DefaultWindowedDocumentManagerServiceType.RibbonForm)) mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1))
Create()方法
如果您传递的是null而不是owner参数,框架会尝试找到一个应该是Service所有者的视图,在大多数情况下,使用活动窗口。
- Create(IWin32Window owner)——创建具有特定所有者的默认类型的Service,默认类型是全局注册的类型。例如,如果您有全局注册的功能区表单服务(RegisterRibbonFormWindowedDocumentManagerService),本地服务也会显示功能区表单,如果没有注册全局服务,则默认类型为XtraForm。
- Create(IWin32Window owner, DefaultWindowedDocumentManagerServiceType type)——创建一个具有目标所有者的本地服务,服务类型取决于类型参数。
- CreateXtraFormService(IWin32Window owner)——注册一个服务,在XtraForms中托管它的项目。
- CreateRibbbonFormService(IWin32Window owner) ——注册一个服务,在RibbonForms中托管它的项目。
- CreateFlyoutFormService(IWin32Window owner)——注册一个服务,该服务在弹出对话框中承载其项目。
- Create(IDocumentAdapterFactory factory) —— 一种扩展方法,允许您为 WindowedDocumentManagerService设置本地内容提供程序,使用此方法注册的服务将子提供程序项目添加为浮动表单。例如,以下代码注册与DocumentManager的TabbedView关联的服务,当您调用该CreateDocument方法时,服务会将浮动文档添加到此TabbedView。
C#:
mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1));
VB.NET:
mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1))
下面的对象实现了IDocumentAdapterFactory接口,并且可以作为参数传递给这个方法:
- DocumentManager组件的TabbedView和NativeMdiView视图
- XtraTabbedMdiManager
XtraTabControl和NavigationFrame子项目总是停靠的,不能将这些控件用作工厂参数。
Create(Func<Form> factoryMethod, IWin32Window owner) ——允许您创建自定义工厂(实现IDocumentAdapterFactory接口的对象)。
公共服务方式
- Documents——提供对此服务管理的项集合的访问的属性。
- ActiveDocument——获取或设置活动项。
- CreateDocument——创建新项的三个扩展方法,根据注册的不同,项目是一个独立的表单/XtraForm/RibbonForm或浮动面板由DocumentManager/XtraTabbedMdiManager拥有。
导航服务
该服务允许您在NavigationFrame控件中从一个视图导航到另一个视图,并将应用程序视图作为托管控件中的页面打开(例如,作为TabbedView选项卡)。
接口
INavigationService
管理控件
- 导航框架
- DocumentManager
- XtraTabControl
- XtraTabbedMdiManager
- Dock Manager
- TabFormControl
Global Registration
不可用。
Local Registration
C#:
mvvmContext1.RegisterService(NavigationService.Create(navigationFrame1));
VB.NET:
mvvmContext1.RegisterService(NavigationService.Create(navigationFrame1))
Create()方法
Create(IDocumentAdapterFactory factory)——允许您为此服务设置本地内容提供者的扩展方法,当使用此方法创建时,服务将创建新项作为提供者的子项。
公共服务方式
与DocumentManagerService中相同的命令可用,加上以下导航API:
- BackNavigationMode——允许您指定当用户按下“返回”按钮时屏幕上出现的模块:前一个模块还是根模块。
- GoBack, GoForward ——导航到先前查看的模块或放弃此导航。
- CanGoBack, CanGoForward ——返回是否可以在给定方向上导航。
- Navigate ——导航到目标视图,其名称作为字符串参数传递给此方法。
DispatcherService
允许您使用dispatcher在ViewModel中执行操作。
接口
管理控件
没有。
Global Registration
此服务已注册。
Local Registration
C#:
mvvmContext1.RegisterService(DispatcherService.Create());
VB.NET:
mvvmContext1.RegisterService(DispatcherService.Create())
Create()方法
- Create()——创建一个新的Service实例。
公共服务方式
BeginInvoke——异步执行指定的委托。
C#:
async Task DoSomethingAsync(){ var dispatcher = this.GetService<IDispatcherService>(); // Obtain the UI-thread's dispatcher // Do something asynchronously await Task.Delay(100); await dispatcher.BeginInvoke(()=>{ // Perform an update // this.RaisePropertiesChanged() }); }
VB.NET:
Private Async Sub DoSomethingAsync() As Task Dim dispatcher = Me.GetService(Of IDispatcherService)() 'Obtain the UI-thread's dispatcher ' Do something asynchronously Await Task.Delay(100) Await dispatcher.BeginInvoke(Function() ' Perform an update ' Me.RaisePropertiesChanged() End Function) End Sub
通知服务
显示传统的警报窗口和Windows Toast通知。
接口
INotificationService
管理控件
- Toast Notification Manager
- Alert Windows
Global Registration
不可用。
Local Registration
C#:
mvvmContext.RegisterService(NotificationService.Create(toastNotificationManager));
VB.NET:
mvvmContext.RegisterService(NotificationService.Create(toastNotificationManager))
Create()方法
- Create(INotificationProvider manager)——创建一个使用目标管理器显示通知的服务,接受ToastNotificationsManager和AlertControl类实例作为参数。
公共服务方式
- CreatePredefinedNotification(string header, string body, string body2, object image = null)——创建带有图像、标题文本字符串和两个常规正文文本字符串的通知。注意,这个方法创建了一个通知,但没有显示它——要使它可见,请调用ShowAsync方法。请参阅下面的代码片段来获取示例。
C#:
protected INotificationService INotificationService { get { return this.GetService<INotificationService>(); } } public virtual INotification Notification { get; set; } public async void ShowNotification() { // Create a notification with the predefined template. Notification = INotificationService.CreatePredefinedNotification("Hello", "Have a nice day!", "Greeting"); // Display the created notification asynchronously. try { await Notification.ShowAsync(); } catch(AggregateException e) { // Handle errors. MessageBoxService.ShowMessage(e.InnerException.Message, e.Message); } } public void HideNotification() { // Hide the notification Notification.Hide(); }
VB.NET:
Protected ReadOnly Property INotificationService() As INotificationService Get Return Me.GetService(Of INotificationService)() End Get End Property Public Overridable Property Notification() As INotification Public Async Sub ShowNotification() ' Create a notification with the predefined template. Notification = INotificationService.CreatePredefinedNotification("Hello", "Have a nice day!", "Greeting") ' Display the created notification asynchronously. Try Await Notification.ShowAsync() Catch ex As AggregateException ' Handle errors. MessageBoxService.ShowMessage(ex.InnerException.Message, ex.Message) End Try End Sub Public Sub HideNotification() ' Hide the notification. Notification.Hide() End Sub
如果该ShowAsync方法无法显示通知(例如,如果 Windows 操作系统设置禁用 toast 通知),则该方法会在非UI线程中异步引发异常,此异常不会影响UI线程。要处理这些异常并响应通知显示失败,请ShowAsync使用块包装方法的调用try..catch。
- CreateCustomNotification(object viewModel)——创建一个带有 ViewModel 的通知,ViewModel 参数需要一个实现DevExpress.Utils.MVVM.Services.INotificationInfo接口的类的实例。该界面公开一张图像和三个字符串属性,允许您通知设置图标、标题文本字符串和两个常规文本字符串。下面的代码说明了一个示例。
C#:
public class HelloViewModelWithINotificationInfo : INotificationInfo { protected INotificationService INotificationService { get { return this.GetService<INotificationService>(); } } public virtual INotification Notification { get; set; } public void ShowNotification() { // Creating a custom notification Notification = INotificationService.CreateCustomNotification(this); } string INotificationInfo.Header { get { return "Hello, buddy!"; } } string INotificationInfo.Body { get { return "Have a nice day!"; } } string INotificationInfo.Body2 { get { return "Greeting"; } } System.Drawing.Image INotificationInfo.Image { get { return null; } } }
VB.NET:
Public Class HelloViewModelWithINotificationInfo Implements INotificationInfo Protected ReadOnly Property INotificationService() As INotificationService Get Return Me.GetService(Of INotificationService)() End Get End Property Public Overridable Property Notification() As INotification Public Sub ShowNotification() ' Creating a custom notification Notification = INotificationService.CreateCustomNotification(Me) End Sub Private ReadOnly Property INotificationInfo_Header() As String Implements INotificationInfo.Header Get Return "Hello, buddy!" End Get End Property Private ReadOnly Property INotificationInfo_Body() As String Implements INotificationInfo.Body Get Return "Have a nice day!" End Get End Property Private ReadOnly Property INotificationInfo_Body2() As String Implements INotificationInfo.Body2 Get Return "Greeting" End Get End Property Private ReadOnly Property INotificationInfo_Image() As System.Drawing.Image Implements INotificationInfo.Image Get Return Nothing End Get End Property End Class
CreateCustomNotification方法创建一个通知,但不显示它,要显示通知,调用通知的' show '和' Hide '方法。
启动画面服务
此服务允许您显示启动屏幕和等待表单,表明应用程序正忙。
接口
管理控件
Splash Screen Manager
Global Registration
此服务已注册。
Local Registration
C#:
mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager));
VB.NET:
mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager))
Create()方法
- Create(ISplashScreenServiceProvider serviceProvider)——创建一个管理目标启动屏幕管理器的服务。
- Create(ISplashScreenServiceProvider serviceProvider, DefaultBoolean throwExceptions) ——创建一个服务,该服务管理目标启动屏幕管理器,并在发生错误时抛出异常。
公共服务方式
ShowSplashScreen(string documentType)—— 显示启动屏幕或特定类型的等待表单。“documentType”参数是从SplashScreen类派生的 ViewModel 的名称,表示需要显示的启动屏幕。如果传递null作为参数,则会创建由DevExpress设计的默认启动屏幕。
要显示Fluent Splash Screen或Overlay Form,请将相应的字符串 ID 传递给该ShowSplashScreen方法。
叠加形式:
C#:
//ViewModel public class OverlayViewModel { protected ISplashScreenService SplashScreenService { get { return this.GetService<ISplashScreenService>(); } } public async System.Threading.Tasks.Task Wait() { SplashScreenService.ShowSplashScreen("#Overlay#"); //do something await System.Threading.Tasks.Task.Delay(2500); SplashScreenService.HideSplashScreen(); } } //View mvvmContext.ViewModelType = typeof(OverlayViewModel); mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager)); var fluent = mvvmContext.OfType<OverlayViewModel>(); fluent.BindCommand(showButton, x => x.Wait);
VB.NET:
'ViewModel Public Class OverlayViewModel Protected ReadOnly Property SplashScreenService() As ISplashScreenService Get Return Me.GetService(Of ISplashScreenService)() End Get End Property Public Async Function Wait() As System.Threading.Tasks.Task SplashScreenService.ShowSplashScreen("#Overlay#") 'do something Await System.Threading.Tasks.Task.Delay(2500) SplashScreenService.HideSplashScreen() End Function End Class 'View mvvmContext.ViewModelType = GetType(OverlayViewModel) mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager)) Dim fluent = mvvmContext.OfType(Of OverlayViewModel)() fluent.BindCommand(showButton, Function(x) x.Wait)
流畅的启动界面:
C#:
//ViewModel public class FluentSplashScreenViewModel { protected ISplashScreenService SplashScreenService { get { return this.GetService<ISplashScreenService>(); } } public void Show() { SplashScreenService.ShowSplashScreen("#FluentSplashScreen#"); } public void Hide() { System.Threading.Thread.Sleep(1000); SplashScreenService.HideSplashScreen(); } } //View mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager)); var fluent = mvvmContext.OfType<FluentSplashScreenViewModel>(); fluent.BindCommand(showButton, x => x.Show); fluent.BindCommand(hideButton, x => x.Hide);
VB.NET:
'ViewModel Public Class FluentSplashScreenViewModel Protected ReadOnly Property SplashScreenService() As ISplashScreenService Get Return Me.GetService(Of ISplashScreenService)() End Get End Property Public Sub Show() SplashScreenService.ShowSplashScreen("#FluentSplashScreen#") End Sub Public Sub Hide() System.Threading.Thread.Sleep(1000) SplashScreenService.HideSplashScreen() End Sub End Class 'View mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager)) Dim fluent = mvvmContext.OfType(Of FluentSplashScreenViewModel)() fluent.BindCommand(showButton, Function(x) x.Show) fluent.BindCommand(hideButton, Function(x) x.Hide)
- HideSplashScreen()——隐藏活动的启动屏幕或等待表单。
- SetSplashScreenProgress(double progress, double maxProgress) and SetSplashScreenState(object state) ——将自定义数据注入当前可见的启动画面或等待表单的方法,SetSplashScreenProgress方法更新启动屏幕进度条,SetSplashScreenState发送任何其他类型的数据(例如,启动屏幕标签的字符串数据)。
启动画面
启动画面可以利用这两种方法,要接收和使用注入的数据,请使用启动屏幕管理器的智能标签菜单添加新的启动屏幕。启动屏幕的代码包含“覆盖”区域:覆盖其SplashFormBase.ProcessCommand方法来解析数据。
C#:
public partial class SplashScreen1 : SplashScreen { public SplashScreen1() { InitializeComponent(); } #region Overrides public override void ProcessCommand(Enum cmd, object arg) { base.ProcessCommand(cmd, arg); } #endregion }
VB.NET:
Partial Public Class SplashScreen1 Inherits SplashScreen Public Sub New() InitializeComponent() End Sub #Region "Overrides" Public Overrides Sub ProcessCommand(ByVal cmd As System.Enum, ByVal arg As Object) MyBase.ProcessCommand(cmd, arg) End Sub #End Region End Class
SetSplashScreenProgress 和SetSplashScreenState方法还可以将数据发送到启动屏幕和等待表单。为此,请使用简单对象(字符串、数值等)作为方法参数,执行此操作时,SplashFormBase.ProcessCommand方法将接收这些简单对象作为arg参数,并接收DemoProgressSplashScreen.CommandId枚举器值作为cmd参数,检查cmd参数来确定哪个命令发送到您的启动屏幕并相应地使用arg值。
下面的 ViewModel 代码调用SetSplashScreenState方法来传输闪屏标签的“几乎完成...”字符串。“ SetSplashScreenProgress ”发送当前(80)和最大(100)进度条值。
C#:
public class Form1ViewModel { protected ISplashScreenService SplashScreenService { get { return this.GetService<ISplashScreenService>(); } } public void Show() { SplashScreenService.ShowSplashScreen("SplashScreen1"); SplashScreenService.SetSplashScreenState("Almost done..."); //label text SplashScreenService.SetSplashScreenProgress(80, 100); //progress bar values } }
VB.NET:
Public Class Form1ViewModel Protected ReadOnly Property SplashScreenService() As ISplashScreenService Get Return Me.GetService(Of ISplashScreenService)() End Get End Property Public Sub Show() SplashScreenService.ShowSplashScreen("SplashScreen1") SplashScreenService.SetSplashScreenState("Almost done...") 'label text SplashScreenService.SetSplashScreenProgress(80, 100) 'progress bar values End Sub End Class
SetSplashScreenState方法使用cmd参数的CommandId.MVVMSetState值调用ProcessCommand重写。SetSplashScreenProgress方法调用ProcessCommand重写两次:首先,cmd参数返回 CommandId.SetProgressValue;其次,cmd参数返回 CommandId.SetProgressValue,读取这些参数值并应用来自arg参数的数据。
C#:
public partial class SplashScreen1 : SplashScreen { public SplashScreen1() { InitializeComponent(); } #region Overrides public override void ProcessCommand(Enum cmd, object arg) { base.ProcessCommand(cmd, arg); DemoProgressSplashScreen.CommandId command = (DemoProgressSplashScreen.CommandId)cmd; //received from the SetSplashScreenState method if(command == DemoProgressSplashScreen.CommandId.MVVMSetState) labelControl2.Text = (string)arg; //two separate values received from the SetSplashScreenProgress method if(command == DemoProgressSplashScreen.CommandId.SetMaxProgressValue) progressBarControl1.Properties.Maximum = (int)arg; if(command == DemoProgressSplashScreen.CommandId.SetProgressValue) progressBarControl1.EditValue = (int)arg; } #endregion }
VB.NET:
Partial Public Class SplashScreen1 Inherits SplashScreen Public Sub New() InitializeComponent() End Sub #Region "Overrides" Public Overrides Sub ProcessCommand(ByVal cmd As System.Enum, ByVal arg As Object) MyBase.ProcessCommand(cmd, arg) Dim command As DemoProgressSplashScreen.CommandId = CType(cmd, DemoProgressSplashScreen.CommandId) 'received from the SetSplashScreenState method If command Is DemoProgressSplashScreen.CommandId.MVVMSetState Then labelControl2.Text = DirectCast(arg, String) End If 'two separate values received from the SetSplashScreenProgress method If command Is DemoProgressSplashScreen.CommandId.SetMaxProgressValue Then progressBarControl1.Properties.Maximum = DirectCast(arg, Integer) End If If command Is DemoProgressSplashScreen.CommandId.SetProgressValue Then progressBarControl1.EditValue = DirectCast(arg, Integer) End If End Sub #End Region End Class
下图展示了结果。
当您更新一个启动屏幕元素时,请使用上面的示例。否则,由于SetSplashScreenState方法总是返回CommandId.MVVMSetState作为cmd参数,因此无法知道arg数据应该去哪里。对于这种情况,请改用以下方法之一。
- 使用复杂对象作为参数调用SetSplashScreenState方法,该对象应包含枚举器值和所需的数据。您可以使用System.Tuple结构体、System.Collections.Generic.KeyValuePair对象或object[]数组作为参数。
- 调用使用DevExpress.Utils.MVVM.Services.SplashScreenServiceState对象作为参数的SetSplashScreenState方法,此对象具有Command和State fields字段,使用这些字段可以传递所需的数据和相应的枚举器值。
这些方法如以下代码所示。首先,声明一个自定义SplashScreenCommand枚举器。
C#:
public enum SplashScreenCommand { StateLabelCommand, PercentLabelCommand, ProgressBarCommand }
VB.NET:
Public Enum SplashScreenCommand StateLabelCommand PercentLabelCommand ProgressBarCommand End Enum
这些自定义枚举器值标记来自SetSplashScreenState方法的不同数据类型。
C#:
public void Show() { SplashScreenService.ShowSplashScreen("SplashScreen1"); //customizing the first label text SplashScreenService.SetSplashScreenState(new SplashScreenServiceState(SplashScreenCommand.StateLabelCommand, "Almost done...")); //customizing the second label text SplashScreenService.SetSplashScreenState(new SplashScreenServiceState(SplashScreenCommand.PercentLabelCommand, "80%")); //sending the current progress bar value object[] customArray = new object[] { SplashScreenCommand.ProgressBarCommand, 80 }; SplashScreenService.SetSplashScreenState(customArray); }
VB.NET:
Public Sub Show() SplashScreenService.ShowSplashScreen("SplashScreen1") 'customizing the first label text SplashScreenService.SetSplashScreenState(New SplashScreenServiceState(SplashScreenCommand.StateLabelCommand, "Almost done...")) 'customizing the second label text SplashScreenService.SetSplashScreenState(New SplashScreenServiceState(SplashScreenCommand.PercentLabelCommand, "80%")) 'sending the current progress bar value Dim customArray() As Object = { SplashScreenCommand.ProgressBarCommand, 80 } SplashScreenService.SetSplashScreenState(customArray) End Sub
由于您的数据现在附带了相应的枚举器值,因此可以确定arg参数中存储了哪些数据并正确使用它。
C#:
public override void ProcessCommand(Enum cmd, object arg) { base.ProcessCommand(cmd, arg); if(cmd.Equals(SplashScreenCommand.StateLabelCommand)) stateLabel.Text = (string)arg; if(cmd.Equals(SplashScreenCommand.PercentLabelCommand)) percentLabel.Text = (string)arg; if(cmd.Equals(SplashScreenCommand.ProgressBarCommand)) progressBarControl1.EditValue = (int)arg; }
VB.NET:
Public Overrides Sub ProcessCommand(ByVal cmd As System.Enum, ByVal arg As Object) MyBase.ProcessCommand(cmd, arg) If cmd.Equals(SplashScreenCommand.StateLabelCommand) Then stateLabel.Text = DirectCast(arg, String) End If If cmd.Equals(SplashScreenCommand.PercentLabelCommand) Then percentLabel.Text = DirectCast(arg, String) End If If cmd.Equals(SplashScreenCommand.ProgressBarCommand) Then progressBarControl1.EditValue = DirectCast(arg, Integer) End If End Sub
下图展示了一个带有进度条和两个标签的启动画面,这三个元素使用SetSplashScreenState方法更新。
等待表单
要显示等待表单,使用相同的ShowSplashScreen和SetSplashScreenState方法。表单有两个标准的文本块——标题和描述,因此SetSplashScreenState应该传递一个在Wait Form的ProcessCommand方法中解析的双字符串数组。
C#:
public class MyWaitForm : DevExpress.XtraWaitForm.DemoWaitForm { public override void ProcessCommand(Enum cmd, object arg) { string[] args = arg as string[]; SetCaption(args[0]); SetDescription(args[1]); } } public class MyWaitFormViewModel { protected ISplashScreenService SplashScreenService { get { return this.GetService<ISplashScreenService>(); } } public async System.Threading.Tasks.Task Wait() { SplashScreenService.ShowSplashScreen("MyWaitForm"); SplashScreenService.SetSplashScreenState(new string[] { "Please, wait", "In progress..." }); SplashScreenService.HideSplashScreen(); } }
VB.NET:
Public Class MyWaitForm Inherits DevExpress.XtraWaitForm.DemoWaitForm Public Overrides Sub ProcessCommand(ByVal cmd As [Enum], ByVal arg As Object) Dim args As String() = TryCast(arg, String()) SetCaption(args(0)) SetDescription(args(1)) End Sub End Class Public Class MyWaitFormViewModel Protected ReadOnly Property SplashScreenService As ISplashScreenService Get Return Me.GetService(Of ISplashScreenService)() End Get End Property Public Async Function Wait() As System.Threading.Tasks.Task SplashScreenService.ShowSplashScreen("MyWaitForm") SplashScreenService.SetSplashScreenState(New String() {"Please, wait", "In progress..."}) SplashScreenService.HideSplashScreen() End Function End Class
打开并保存文件对话框服务
这些服务调用允许用户打开文件并将其保存到本地存储的对话框。
接口
IOpenFileDialogService , ISaveFileDialogService
管理控件
没有。
Global Registration
两项服务均已注册。
Local Registration
C#:
mvvmContext1.RegisterService(OpenFileDialogService.Create()); mvvmContext1.RegisterService(OpenFileDialogService.Create(mySettings)); mvvmContext1.RegisterService(SaveFileDialogService.Create()); mvvmContext1.RegisterService(SaveFileDialogService.Create(mySettings));
VB.NET:
mvvmContext1.RegisterService(OpenFileDialogService.Create()) mvvmContext1.RegisterService(OpenFileDialogService.Create(mySettings)) mvvmContext1.RegisterService(SaveFileDialogService.Create()) mvvmContext1.RegisterService(SaveFileDialogService.Create(mySettings))
Create() 方法
Create()——创建一个文件对话框服务。
Create(SaveFileDialogServiceOptionsdialogServiceOptions)/Create(OpenFileDialogServiceOptionsdialogServiceOptions)——使用指定的设置创建所需的文件对话框服务(请参阅“公共服务方法”部分中列出的对话框属性)。
公共服务方式
- ShowDialog(Action<CancelEventArgs> fileOK, string directoryName)——显示当前对话框服务,如果文件成功打开(保存),则执行fileOK回调,可选的directoryName参数指定启动对话框文件夹,对于 SaveFileDialogService,第三个字符串 fileName参数也可用,该参数指定保存文件的默认名称。
- MultiSelect ——一个布尔属性,指定是否允许用户同时打开多个文件(仅限 OpenFileDialogService)。
- OverwritePromt —— 一个布尔属性,指定当您尝试保存名称已存在的文件时是否显示确认消息(仅限 SaveFileDialogService)。
- Title —— 指定对话框标题的字符串值,此属性和以下所有属性均继承自FileDialogService基类。
- DialogStyle——允许您在常规的WinForms和可皮肤的DevExpress对话框之间进行选择。
- Filter ——指定文件扩展名的字符串值,此对话框支持,这个字符串应该包含过滤器的描述,后面跟着竖条和过滤器模式。下面的代码演示了一个示例。
C#:
this.Filter = "JPEG Images|*.jpg;*.jpeg|PNG Images|*.png|RAW Image Data|*.raw";
VB.NET:
Me.Filter = "JPEG Images|*.jpg;*.jpeg|PNG Images|*.png|RAW Image Data|*.raw"
- File——返回对话框打开(保存)的文件。
文件夹浏览器对话框服务
接口
IFolderBrowserDialogService
管理控件
没有。
Global Registration
该服务已注册。
Local Registration
C#:
mvvmContext1.RegisterService(FolderBrowserDialogService.Create()); mvvmContext1.RegisterService(FolderBrowserDialogService.Create(options));
VB.NET:
mvvmContext1.RegisterService(FolderBrowserDialogService.Create()) mvvmContext1.RegisterService(FolderBrowserDialogService.Create(options))
Create() 方法
Create()——创建文件夹浏览器对话框服务的新实例。
Create(FolderBrowserDialogServiceOptionsdialogServiceOptions)——使用指定的设置创建文件夹浏览器对话框服务的新实例(请参阅“公共服务方法”部分中列出的对话框属性)。
公共服务方式
- ShowDialog() ——显示文件夹浏览器对话框。
- ShowNewFolderButton—— 一个布尔属性,指定是否允许用户在当前层次结构中创建新文件夹。
- StartPath——指定最初选择的文件夹的字符串属性。
- RootFolder—— Environment.SpecialFolder类型的属性,它将层次结构限制为特定文件夹(例如“我的文档”文件夹)。
- 描述—— 一个字符串属性,允许您指定对话框的描述。
- DialogStyle——允许您在常规 WinForms 和DevExpress XtraFolderBrowser对话框之间进行选择。DevExpress 对话框有“Wide”或“Compact”样式(请参阅XtraFolderBrowserDialog.DialogStyle属性)。
如何使用服务扩展方法
本节介绍如何使用服务扩展方法的最常见参数。
对象视图模型
此参数存储应导航到、在对话框中打开、托管在新 DocumentManager 文档中等的子ViewModel实例。要创建此类实例,请使用ViewModelSource.Create方法。
C#:
//ViewModelA.cs public class ViewModelA { . . . public static ViewModelA Create() { return ViewModelSource.Create<ViewModelA>(); } } //ViewModelB.cs public class ViewModelB { ViewModelA childViewModel; public ViewModelB() { childViewModel = ViewModelA.Create(); } IDialogService DialogService { get { return this.GetService<IDialogService>(); } } public void ShowDialog() { DialogService.ShowDialog(MessageButton.OK, "This dialog contains View A", "ViewA", childViewModel); } }
VB.NET:
'ViewModelA.vb Public Class ViewModelA . . . Public Shared Function Create() As ViewModelA Return ViewModelSource.Create(Of ViewModelA)() End Function End Class 'ViewModelB.vb Public Class ViewModelB Private childViewModel As ViewModelA Public Sub New() childViewModel = ViewModelA.Create() End Sub Private ReadOnly Property DialogService() As IDialogService Get Return Me.GetService(Of IDialogService)() End Get End Property Public Sub ShowDialog() DialogService.ShowDialog(MessageButton.OK, "This dialog contains View A", "ViewA", childViewModel) End Sub End Class
object parentViewModel
作为SetParentViewModel扩展方法的替代方法,该参数传递parent ViewModel的一个实例,使用此参数的扩展方法通常也有Parameter参数。
对象参数
这个参数将特定的对象传递给实现ISupportParameter接口的子ViewModels。实现此接口的ViewModels具有Parameter属性,该属性会重新计算此参数并将其传递回调用方法的位置。
C#:
//child ViewModel public class LoginViewModel: ISupportParameter { . . . public object Parameter { get { // 3. Returns the new parameter value } set { // 2. myParameter object received from the extension method. } } } //parent ViewModel // 1. The extension method is called DialogService.ShowDialog(MessageButton.OK, "This dialog passes the parameter to the child ViewModel", "LoginView", myParameter, this); // 4. myParameter object now has a new value, set within the child ViewModel
VB.NET:
'child ViewModel Public Class LoginViewModel Implements ISupportParameter . . . Public Property Parameter() As Object Get ' 3. Returns the new parameter value End Get Set(ByVal value As Object) ' 2. myParameter object received from the extension method. End Set End Property End Class 'parent ViewModel ' 1. The extension method is called DialogService.ShowDialog(MessageButton.OK, "This dialog passes the parameter to the child ViewModel", "LoginView", myParameter, Me) ' 4. myParameter object now has a new value, set within the child ViewModel
方法变化
共有三种可能的方法参数:viewModel、parentViewModel和parameter。然而,只能有两种可能的扩展方法组合。
- viewModel:创建一个子 ViewModel(包括其父级和必需的参数),并将该实例传递给 View。
- 参数+ parentViewModel:参数被注入到View中并传递给为此View创建的子ViewModel。
对于后一种情况,可以使用Framework进行数据注入或者调用以下方法推迟数据注入:
C#:
//postpone all data injection ViewModelInjectionPolicy.DenyViewModelInjection(); //postpone parameter injection ViewModelInjectionPolicy.DenyImmediateParameterInjection(); //postpone parentViewModel injection ViewModelInjectionPolicy.DenyImmediateParentViewModelInjection();
VB.NET:
'postpone all data injection ViewModelInjectionPolicy.DenyViewModelInjection() 'postpone parameter injection ViewModelInjectionPolicy.DenyImmediateParameterInjection() 'postpone parentViewModel injection ViewModelInjectionPolicy.DenyImmediateParentViewModelInjection()