国产精品青草久-国产精品情侣愉拍-国产精品区网红主-国产精品区一区二-国产精品热久久-国产精品热热热-国产精品人aⅴ-国产精品人成在线-国产精品人妻人伦-国产精品人人

金喜正规买球

logo DevExpress WinForm中文手冊(cè)

文檔金喜正規(guī)買球>>DevExpress WinForm中文手冊(cè)>>標(biāo)準(zhǔn)DevExpress服務(wù)

標(biāo)準(zhǔn)DevExpress服務(wù)


立即下載DevExpress WinForms

DevExpress Services將ViewModel中的命令傳遞給View中的控件,這允許您在不分離應(yīng)用層的情況下修改UI。

可用服務(wù)
  • 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
附加信息
  • 如何使用服務(wù)
  • 如何使用服務(wù)擴(kuò)展方法

如何使用服務(wù)

1.注冊(cè)服務(wù)。

  • 本地注冊(cè)(服務(wù)僅在視圖中可用):調(diào)用mvvmContext1.RegisterService方法并將 Service 的Create方法之一作為參數(shù)傳遞。DevExpress MVVM 框架自動(dòng)注冊(cè)最常用的服務(wù)——請(qǐng)參閱下面“全局注冊(cè)”部分中的注釋。
  • 全局注冊(cè)(服務(wù)可用于整個(gè)應(yīng)用程序):調(diào)用相應(yīng)的靜態(tài)MVVMContext.Register…服務(wù)方法。
  1. 定義一個(gè)ViewModel屬性,返回一個(gè)相關(guān)Service接口的對(duì)象(例如,如果注冊(cè)了WindowedDocumentManagerService,您的屬性應(yīng)該是IDocumentManagerService類型)。
  2. 使用此屬性可訪問服務(wù)并調(diào)用服務(wù)方法向視圖發(fā)送命令。

示例

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框架自動(dòng)調(diào)用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枚舉值來確定要?jiǎng)?chuàng)建的服務(wù)類型。
  • CreateMessageBoxService() ——?jiǎng)?chuàng)建一個(gè)使用標(biāo)準(zhǔn)WinForms消息框的Service。
  • CreateXtraMessageBoxService() ——?jiǎng)?chuàng)建一個(gè)使用DevExpress XtraMessageBox對(duì)象的Service。
  • CreateFlyoutMessageBoxService() ——?jiǎng)?chuàng)建一個(gè)使用FlyoutDialog對(duì)象的服務(wù)。

 所有四個(gè)方法都有對(duì)應(yīng)的重載與第二個(gè)IWin32Window所有者參數(shù),此參數(shù)允許指定擁有此服務(wù)的視圖。如果您傳遞的是null而不是owner參數(shù),框架將嘗試找到一個(gè)應(yīng)該是Service所有者的適當(dāng)視圖并在大多數(shù)情況下使用活動(dòng)窗口。

Public Service Members
  • ShowMessage ——五個(gè)顯示消息框的擴(kuò)展方法。
  • MessageBoxFormStyle——允許您訪問消息框表單并修改其外觀設(shè)置。例如,下面的代碼說明了如何將粗體字體樣式應(yīng)用于消息框按鈕。

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

允許您顯示對(duì)話框。

接口

IDialogService

管理控件
  • XtraForm
  • FlyoutDialog
  • RibbonForm
Global Registration

C#:

MVVMContext.RegisterXtraDialogService();
MVVMContext.RegisterFlyoutDialogService();
MVVMContext.RegisterRibbonDialogService();

VB.NET:

MVVMContext.RegisterXtraDialogService()
MVVMContext.RegisterFlyoutDialogService()
MVVMContext.RegisterRibbonDialogService()

 DevExpress MVVM框架自動(dòng)調(diào)用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…'方法都需要一個(gè)擁有該服務(wù)的視圖。如果傳遞的是null而不是View,框架會(huì)嘗試找到一個(gè)合適的窗口(在大多數(shù)情況下,會(huì)使用活動(dòng)窗口)。

  • Create(IWin32Window owner, DefaultDialogServiceType type) ——使用DefaultDialogServiceType枚舉值來確定要?jiǎng)?chuàng)建的服務(wù)類型。
  • CreateXtraDialogService(IWin32Window所有者)——?jiǎng)?chuàng)建一個(gè)顯示可剝皮DevExpress對(duì)話框的服務(wù)。
  • CreateFlyoutDialogService(IWin32Window所有者)——?jiǎng)?chuàng)建一個(gè)顯示flyoutdialog的服務(wù)。
  • CreateRibbonDialogService(IWin32Windowowner)——?jiǎng)?chuàng)建一個(gè)服務(wù),將帶有嵌入式RibbonControl的RibbonForm顯示為對(duì)話框,對(duì)話框按鈕顯示為功能區(qū)項(xiàng)目。
  • Create(IWin32Window owner, string title, Func<IDialogForm> factoryMethod)——允許您注冊(cè)一個(gè)Service來管理自定義對(duì)話框(實(shí)現(xiàn)IDialogForm接口的對(duì)象)。

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)——接受創(chuàng)建自定義對(duì)話框的工廠類。
Public Service Methods

ShowDialog——六種擴(kuò)展方法,顯示具有特定外觀和內(nèi)容的對(duì)話框。

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對(duì)象替換默認(rèn)對(duì)話框按鈕。為此,使用自定義命令的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——允許您訪問對(duì)話框并修改其外觀設(shè)置。例如,下面的代碼說明了如何將粗體字體樣式應(yīng)用于彈出對(duì)話框按鈕。

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

當(dāng)前對(duì)話服務(wù)

允許您管理當(dāng)前可見的對(duì)話框。

接口

DevExpress.Mvvm.ICurrentDialogService

注冊(cè)

服務(wù)只有在有活動(dòng)對(duì)話框時(shí)才存在——您不能注冊(cè)CurrentDialogService。

Create()方法

沒有

Public Service Methods
  • Close()、Close(MessageResultdialogResult)和Close (UICommanddialogResult) —— 使用給定的DialogResult關(guān)閉對(duì)話框,如果結(jié)果是UICommand類型,則調(diào)用相關(guān)的UICommand 。請(qǐng)注意,您只能使用最初傳遞到該方法中的對(duì)話框服務(wù)的UICommand之一ShowDialog。
  • WindowState——這個(gè)屬性允許您改變對(duì)話框的窗口狀態(tài)(正常,最小化或最大化)。

當(dāng)前窗口服務(wù)

類似于CurrentDialogService,但是允許您管理當(dāng)前的應(yīng)用程序窗口(形式)。

接口

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(控制容器)——允許您為任何承載作為方法參數(shù)分配的控件的表單注冊(cè)服務(wù)。
  • 創(chuàng)建(Form currentForm)——為這個(gè)表單注冊(cè)一個(gè)服務(wù)。
  • Create(Func<Form> getCurrentForm)——為getCurrentForm方法返回的任何表單注冊(cè)一個(gè)Service。
公共服務(wù)API

 Activate()、Close()、Hide()和Show() ——允許您控制當(dāng)前窗口的可見性。

WindowState ——此屬性允許您更改窗體的窗口狀態(tài)(正常、最小化或最大化)。

窗口服務(wù)

允許您將視圖顯示為獨(dú)立的窗口(形式),并從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"))
本地注冊(cè)(模態(tài)窗口)

如果您想把表單顯示為模態(tài)對(duì)話框請(qǐng)?jiān)谧?cè)前修改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)——?jiǎng)?chuàng)建一個(gè)管理xtraform的服務(wù)。

 CreateRibbonWindowService(IWin32Window owner, string title = null)——?jiǎng)?chuàng)建一個(gè)管理Ribbon窗體的服務(wù)。

 CreateFlyoutWindowService(IWin32Window owner, string title = null)——?jiǎng)?chuàng)建一個(gè)管理Flyouts的服務(wù)。

 Create(IWin32Window owner, DefaultWindowServiceType type, string title = null)——?jiǎng)?chuàng)建一個(gè)Service,其類型取決于type參數(shù)。

 Create(IWin32Window owner, string title = null, Func<IWindow> factoryMethod = null) ——允許注冊(cè)一個(gè)服務(wù)來管理自定義表單(實(shí)現(xiàn)IWindowFactory接口的對(duì)象)。

 Create(IWin32Window owner, string title = null, IWindowFactory factory = null)——接受一個(gè)創(chuàng)建自定義窗口的工廠類。

公共服務(wù)方式
  • Show(object viewModel)——顯示與此 ViewModel 關(guān)聯(lián)的視圖。
  • Show(string documentType, object viewModel)——顯示由目標(biāo) ViewModel 管理的特定視圖。
  • Show(string documentType, objectparameter, objectparentViewModel)——允許您將特定參數(shù)傳遞到表單。
  • Hide()和Activate()——允許您最小化表單或?qū)⑵渲糜谧钋懊妗?
  • Close()——關(guān)閉窗口管理。

DocumentManagerService

提供在MDI(多文檔接口)控件中創(chuàng)建和管理選項(xiàng)卡的方法的本地服務(wù)。

接口

IDocumentManagerService

管理控件
  • DocumentManager
  • Navigation Frame
  • XtraTabControl
  • XtraTabbedMdiManager
  • Dock Manager
  • TabFormControl
Global Registration

由于該服務(wù)管理特定的內(nèi)容提供程序,因此您無法全局注冊(cè)該服務(wù)。

Local Registration

C#:

mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1));

VB.NET:

mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1))
Create()方法
  • Create(IDocumentAdapterFactory factory)——?jiǎng)?chuàng)建一個(gè)控制特定提供者的服務(wù),提供程序是類的控件或?qū)ο螅缮訧DocumentAdapterFactory接口。factory參數(shù)接受以下類型的對(duì)象:
  1. 所有
  2. 選項(xiàng)卡MDI管理器
  3. XtraTabControl
  4. 導(dǎo)航框架
  5. Dock Manager
  6. TabFormControl
  • Create(Func<IDocumentAdapter> factoryMethod)——接受一個(gè)初始化新工廠對(duì)象的factoryMethod函數(shù),這允許您創(chuàng)建自定義工廠(實(shí)現(xiàn)IDocumentAdapterFactory接口的對(duì)象)。
Global Registration

由于該服務(wù)管理特定的內(nèi)容提供程序,因此您無法全局注冊(cè)該服務(wù)。

Local Registration

C#:

mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1));

VB.NET:

mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1))
Create()方法
  • Create(IDocumentAdapterFactory factory)——?jiǎng)?chuàng)建一個(gè)控制特定提供者的服務(wù),提供程序是類的控件或?qū)ο螅缮訧DocumentAdapterFactory接口。factory參數(shù)接受以下類型的對(duì)象:
  1. 所有DocumentManager視圖
  2. 選項(xiàng)卡MDI管理器
  3. XtraTabControl
  4. 導(dǎo)航框架
  5. Dock Manager
  6. TabFormControl
  • Create(Func<IDocumentAdapter> factoryMethod)——接受一個(gè)初始化新工廠對(duì)象的factoryMethod函數(shù),這允許您創(chuàng)建自定義工廠(實(shí)現(xiàn)IDocumentAdapterFactory接口的對(duì)象)。
公共服務(wù)方式
  • Documents——提供對(duì)托管內(nèi)容提供者擁有的項(xiàng)(文檔、選項(xiàng)卡、頁面)集合的訪問的屬性。
  • ActiveDocument——獲得或設(shè)置一個(gè)活躍的項(xiàng)目。
  • CreateDocument——?jiǎng)?chuàng)建該內(nèi)容提供商擁有的新項(xiàng)目的三種擴(kuò)展方法。創(chuàng)建的項(xiàng)目的類型取決于提供者類型。對(duì)于TabbedView、NativeMdiView視圖和XtraTabbedMdiManager控件,CreateDocument方法創(chuàng)建一個(gè)項(xiàng)目,作為選項(xiàng)卡停靠到提供程序。為了創(chuàng)建浮動(dòng)項(xiàng),請(qǐng)改用 WindowedDocumentManagerService (見下文)。

窗口文檔管理器服務(wù)

 允許您添加承載自定義內(nèi)容的新表單。如果服務(wù)是用Create(IDocumentAdapterFactory factory)方法注冊(cè)的,它會(huì)添加新的浮動(dòng)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框架自動(dòng)調(diào)用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參數(shù),框架會(huì)嘗試找到一個(gè)應(yīng)該是Service所有者的視圖,在大多數(shù)情況下,使用活動(dòng)窗口。

  • Create(IWin32Window owner)——?jiǎng)?chuàng)建具有特定所有者的默認(rèn)類型的Service,默認(rèn)類型是全局注冊(cè)的類型。例如,如果您有全局注冊(cè)的功能區(qū)表單服務(wù)(RegisterRibbonFormWindowedDocumentManagerService),本地服務(wù)也會(huì)顯示功能區(qū)表單,如果沒有注冊(cè)全局服務(wù),則默認(rèn)類型為XtraForm。
  • Create(IWin32Window owner, DefaultWindowedDocumentManagerServiceType type)——?jiǎng)?chuàng)建一個(gè)具有目標(biāo)所有者的本地服務(wù),服務(wù)類型取決于類型參數(shù)。
  • CreateXtraFormService(IWin32Window owner)——注冊(cè)一個(gè)服務(wù),在XtraForms中托管它的項(xiàng)目。
  • CreateRibbbonFormService(IWin32Window owner) ——注冊(cè)一個(gè)服務(wù),在RibbonForms中托管它的項(xiàng)目。
  • CreateFlyoutFormService(IWin32Window owner)——注冊(cè)一個(gè)服務(wù),該服務(wù)在彈出對(duì)話框中承載其項(xiàng)目。
  • Create(IDocumentAdapterFactory factory) —— 一種擴(kuò)展方法,允許您為 WindowedDocumentManagerService設(shè)置本地內(nèi)容提供程序,使用此方法注冊(cè)的服務(wù)將子提供程序項(xiàng)目添加為浮動(dòng)表單。例如,以下代碼注冊(cè)與DocumentManager的TabbedView關(guān)聯(lián)的服務(wù),當(dāng)您調(diào)用該CreateDocument方法時(shí),服務(wù)會(huì)將浮動(dòng)文檔添加到此TabbedView。

C#:

mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1));

VB.NET:

mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1))

 下面的對(duì)象實(shí)現(xiàn)了IDocumentAdapterFactory接口,并且可以作為參數(shù)傳遞給這個(gè)方法:

  • DocumentManager組件的TabbedView和NativeMdiView視圖
  • XtraTabbedMdiManager

 XtraTabControl和NavigationFrame子項(xiàng)目總是停靠的,不能將這些控件用作工廠參數(shù)。

 Create(Func<Form> factoryMethod, IWin32Window owner) ——允許您創(chuàng)建自定義工廠(實(shí)現(xiàn)IDocumentAdapterFactory接口的對(duì)象)。

公共服務(wù)方式
  • Documents——提供對(duì)此服務(wù)管理的項(xiàng)集合的訪問的屬性。
  • ActiveDocument——獲取或設(shè)置活動(dòng)項(xiàng)。
  • CreateDocument——?jiǎng)?chuàng)建新項(xiàng)的三個(gè)擴(kuò)展方法,根據(jù)注冊(cè)的不同,項(xiàng)目是一個(gè)獨(dú)立的表單/XtraForm/RibbonForm或浮動(dòng)面板由DocumentManager/XtraTabbedMdiManager擁有。

導(dǎo)航服務(wù)

 該服務(wù)允許您在NavigationFrame控件中從一個(gè)視圖導(dǎo)航到另一個(gè)視圖,并將應(yīng)用程序視圖作為托管控件中的頁面打開(例如,作為TabbedView選項(xiàng)卡)。

接口

INavigationService

管理控件
  • 導(dǎo)航框架
  • 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)——允許您為此服務(wù)設(shè)置本地內(nèi)容提供者的擴(kuò)展方法,當(dāng)使用此方法創(chuàng)建時(shí),服務(wù)將創(chuàng)建新項(xiàng)作為提供者的子項(xiàng)。

公共服務(wù)方式

與DocumentManagerService中相同的命令可用,加上以下導(dǎo)航API:

  • BackNavigationMode——允許您指定當(dāng)用戶按下“返回”按鈕時(shí)屏幕上出現(xiàn)的模塊:前一個(gè)模塊還是根模塊。
  • GoBack, GoForward ——導(dǎo)航到先前查看的模塊或放棄此導(dǎo)航。
  • CanGoBack, CanGoForward ——返回是否可以在給定方向上導(dǎo)航。
  • Navigate ——導(dǎo)航到目標(biāo)視圖,其名稱作為字符串參數(shù)傳遞給此方法。

DispatcherService

允許您使用dispatcher在ViewModel中執(zhí)行操作。

接口

管理控件

沒有。

Global Registration

此服務(wù)已注冊(cè)。

Local Registration

C#:

mvvmContext1.RegisterService(DispatcherService.Create());

VB.NET:

mvvmContext1.RegisterService(DispatcherService.Create())
Create()方法
  • Create()——?jiǎng)?chuàng)建一個(gè)新的Service實(shí)例。
公共服務(wù)方式

BeginInvoke——異步執(zhí)行指定的委托。

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

通知服務(wù)

顯示傳統(tǒng)的警報(bào)窗口和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)——?jiǎng)?chuàng)建一個(gè)使用目標(biāo)管理器顯示通知的服務(wù),接受ToastNotificationsManager和AlertControl類實(shí)例作為參數(shù)。
公共服務(wù)方式
  • CreatePredefinedNotification(string header, string body, string body2, object image = null)——?jiǎng)?chuàng)建帶有圖像、標(biāo)題文本字符串和兩個(gè)常規(guī)正文文本字符串的通知。注意,這個(gè)方法創(chuàng)建了一個(gè)通知,但沒有顯示它——要使它可見,請(qǐng)調(diào)用ShowAsync方法。請(qǐng)參閱下面的代碼片段來獲取示例。

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 操作系統(tǒng)設(shè)置禁用 toast 通知),則該方法會(huì)在非UI線程中異步引發(fā)異常,此異常不會(huì)影響UI線程。要處理這些異常并響應(yīng)通知顯示失敗,請(qǐng)ShowAsync使用塊包裝方法的調(diào)用try..catch。

  • CreateCustomNotification(object viewModel)——?jiǎng)?chuàng)建一個(gè)帶有 ViewModel 的通知,ViewModel 參數(shù)需要一個(gè)實(shí)現(xiàn)DevExpress.Utils.MVVM.Services.INotificationInfo接口的類的實(shí)例。該界面公開一張圖像和三個(gè)字符串屬性,允許您通知設(shè)置圖標(biāo)、標(biāo)題文本字符串和兩個(gè)常規(guī)文本字符串。下面的代碼說明了一個(gè)示例。

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方法創(chuàng)建一個(gè)通知,但不顯示它,要顯示通知,調(diào)用通知的' show '和' Hide '方法。

啟動(dòng)畫面服務(wù)

此服務(wù)允許您顯示啟動(dòng)屏幕和等待表單,表明應(yīng)用程序正忙。

接口

管理控件

Splash Screen Manager

Global Registration

此服務(wù)已注冊(cè)。

Local Registration

C#:

mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager));

VB.NET:

mvvmContext.RegisterService(SplashScreenService.Create(splashScreenManager))
Create()方法
  • Create(ISplashScreenServiceProvider serviceProvider)——?jiǎng)?chuàng)建一個(gè)管理目標(biāo)啟動(dòng)屏幕管理器的服務(wù)。
  • Create(ISplashScreenServiceProvider serviceProvider, DefaultBoolean throwExceptions) ——?jiǎng)?chuàng)建一個(gè)服務(wù),該服務(wù)管理目標(biāo)啟動(dòng)屏幕管理器,并在發(fā)生錯(cuò)誤時(shí)拋出異常。
公共服務(wù)方式

ShowSplashScreen(string documentType)—— 顯示啟動(dòng)屏幕或特定類型的等待表單。“documentType”參數(shù)是從SplashScreen類派生的 ViewModel 的名稱,表示需要顯示的啟動(dòng)屏幕。如果傳遞null作為參數(shù),則會(huì)創(chuàng)建由DevExpress設(shè)計(jì)的默認(rèn)啟動(dòng)屏幕。

 要顯示Fluent Splash Screen或Overlay Form,請(qǐng)將相應(yīng)的字符串 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)

流暢的啟動(dòng)界面:

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()——隱藏活動(dòng)的啟動(dòng)屏幕或等待表單。
  • SetSplashScreenProgress(double progress, double maxProgress) and SetSplashScreenState(object state) ——將自定義數(shù)據(jù)注入當(dāng)前可見的啟動(dòng)畫面或等待表單的方法,SetSplashScreenProgress方法更新啟動(dòng)屏幕進(jìn)度條,SetSplashScreenState發(fā)送任何其他類型的數(shù)據(jù)(例如,啟動(dòng)屏幕標(biāo)簽的字符串?dāng)?shù)據(jù))。
啟動(dòng)畫面

 啟動(dòng)畫面可以利用這兩種方法,要接收和使用注入的數(shù)據(jù),請(qǐng)使用啟動(dòng)屏幕管理器的智能標(biāo)簽菜單添加新的啟動(dòng)屏幕。啟動(dòng)屏幕的代碼包含“覆蓋”區(qū)域:覆蓋其SplashFormBase.ProcessCommand方法來解析數(shù)據(jù)。

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方法還可以將數(shù)據(jù)發(fā)送到啟動(dòng)屏幕和等待表單。為此,請(qǐng)使用簡(jiǎn)單對(duì)象(字符串、數(shù)值等)作為方法參數(shù),執(zhí)行此操作時(shí),SplashFormBase.ProcessCommand方法將接收這些簡(jiǎn)單對(duì)象作為arg參數(shù),并接收DemoProgressSplashScreen.CommandId枚舉器值作為cmd參數(shù),檢查cmd參數(shù)來確定哪個(gè)命令發(fā)送到您的啟動(dòng)屏幕并相應(yīng)地使用arg值。

 下面的 ViewModel 代碼調(diào)用SetSplashScreenState方法來傳輸閃屏標(biāo)簽的“幾乎完成...”字符串。“ SetSplashScreenProgress ”發(fā)送當(dāng)前(80)和最大(100)進(jìn)度條值。

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參數(shù)的CommandId.MVVMSetState值調(diào)用ProcessCommand重寫。SetSplashScreenProgress方法調(diào)用ProcessCommand重寫兩次:首先,cmd參數(shù)返回 CommandId.SetProgressValue;其次,cmd參數(shù)返回 CommandId.SetProgressValue,讀取這些參數(shù)值并應(yīng)用來自arg參數(shù)的數(shù)據(jù)。

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

下圖展示了結(jié)果。

 Running results

 當(dāng)您更新一個(gè)啟動(dòng)屏幕元素時(shí),請(qǐng)使用上面的示例。否則,由于SetSplashScreenState方法總是返回CommandId.MVVMSetState作為cmd參數(shù),因此無法知道arg數(shù)據(jù)應(yīng)該去哪里。對(duì)于這種情況,請(qǐng)改用以下方法之一。 

  • 使用復(fù)雜對(duì)象作為參數(shù)調(diào)用SetSplashScreenState方法,該對(duì)象應(yīng)包含枚舉器值和所需的數(shù)據(jù)。您可以使用System.Tuple結(jié)構(gòu)體、System.Collections.Generic.KeyValuePair對(duì)象或object[]數(shù)組作為參數(shù)。
  • 調(diào)用使用DevExpress.Utils.MVVM.Services.SplashScreenServiceState對(duì)象作為參數(shù)的SetSplashScreenState方法,此對(duì)象具有Command和State fields字段,使用這些字段可以傳遞所需的數(shù)據(jù)和相應(yīng)的枚舉器值。

這些方法如以下代碼所示。首先,聲明一個(gè)自定義SplashScreenCommand枚舉器。

C#:

public enum SplashScreenCommand {
StateLabelCommand,
PercentLabelCommand,
ProgressBarCommand
}

VB.NET:

Public Enum SplashScreenCommand
StateLabelCommand
PercentLabelCommand
ProgressBarCommand
End Enum

這些自定義枚舉器值標(biāo)記來自SetSplashScreenState方法的不同數(shù)據(jù)類型。

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

由于您的數(shù)據(jù)現(xiàn)在附帶了相應(yīng)的枚舉器值,因此可以確定arg參數(shù)中存儲(chǔ)了哪些數(shù)據(jù)并正確使用它。

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

 下圖展示了一個(gè)帶有進(jìn)度條和兩個(gè)標(biāo)簽的啟動(dòng)畫面,這三個(gè)元素使用SetSplashScreenState方法更新。

Startup screen
等待表單

 要顯示等待表單,使用相同的ShowSplashScreen和SetSplashScreenState方法。表單有兩個(gè)標(biāo)準(zhǔn)的文本塊——標(biāo)題和描述,因此SetSplashScreenState應(yīng)該傳遞一個(gè)在Wait Form的ProcessCommand方法中解析的雙字符串?dāng)?shù)組。

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

打開并保存文件對(duì)話框服務(wù)

這些服務(wù)調(diào)用允許用戶打開文件并將其保存到本地存儲(chǔ)的對(duì)話框。

接口

 IOpenFileDialogService , ISaveFileDialogService

管理控件

沒有。

Global Registration

兩項(xiàng)服務(wù)均已注冊(cè)。

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()——?jiǎng)?chuàng)建一個(gè)文件對(duì)話框服務(wù)。

 Create(SaveFileDialogServiceOptionsdialogServiceOptions)/Create(OpenFileDialogServiceOptionsdialogServiceOptions)——使用指定的設(shè)置創(chuàng)建所需的文件對(duì)話框服務(wù)(請(qǐng)參閱“公共服務(wù)方法”部分中列出的對(duì)話框?qū)傩裕?

公共服務(wù)方式
  • ShowDialog(Action<CancelEventArgs> fileOK, string directoryName)——顯示當(dāng)前對(duì)話框服務(wù),如果文件成功打開(保存),則執(zhí)行fileOK回調(diào),可選的directoryName參數(shù)指定啟動(dòng)對(duì)話框文件夾,對(duì)于 SaveFileDialogService,第三個(gè)字符串 fileName參數(shù)也可用,該參數(shù)指定保存文件的默認(rèn)名稱。
  • MultiSelect ——一個(gè)布爾屬性,指定是否允許用戶同時(shí)打開多個(gè)文件(僅限 OpenFileDialogService)。
  • OverwritePromt —— 一個(gè)布爾屬性,指定當(dāng)您嘗試保存名稱已存在的文件時(shí)是否顯示確認(rèn)消息(僅限 SaveFileDialogService)。
  • Title —— 指定對(duì)話框標(biāo)題的字符串值,此屬性和以下所有屬性均繼承自FileDialogService基類。
  • DialogStyle——允許您在常規(guī)的WinForms和可皮膚的DevExpress對(duì)話框之間進(jìn)行選擇。
  • Filter ——指定文件擴(kuò)展名的字符串值,此對(duì)話框支持,這個(gè)字符串應(yīng)該包含過濾器的描述,后面跟著豎條和過濾器模式。下面的代碼演示了一個(gè)示例。

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——返回對(duì)話框打開(保存)的文件。

文件夾瀏覽器對(duì)話框服務(wù)

接口

IFolderBrowserDialogService

管理控件

沒有。

Global Registration

該服務(wù)已注冊(cè)。

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()——?jiǎng)?chuàng)建文件夾瀏覽器對(duì)話框服務(wù)的新實(shí)例。

 Create(FolderBrowserDialogServiceOptionsdialogServiceOptions)——使用指定的設(shè)置創(chuàng)建文件夾瀏覽器對(duì)話框服務(wù)的新實(shí)例(請(qǐng)參閱“公共服務(wù)方法”部分中列出的對(duì)話框?qū)傩裕?

公共服務(wù)方式
  • ShowDialog() ——顯示文件夾瀏覽器對(duì)話框。
  • ShowNewFolderButton—— 一個(gè)布爾屬性,指定是否允許用戶在當(dāng)前層次結(jié)構(gòu)中創(chuàng)建新文件夾。
  • StartPath——指定最初選擇的文件夾的字符串屬性。
  • RootFolder—— Environment.SpecialFolder類型的屬性,它將層次結(jié)構(gòu)限制為特定文件夾(例如“我的文檔”文件夾)。
  • 描述—— 一個(gè)字符串屬性,允許您指定對(duì)話框的描述。
  • DialogStyle——允許您在常規(guī) WinForms 和DevExpress XtraFolderBrowser對(duì)話框之間進(jìn)行選擇。DevExpress 對(duì)話框有“Wide”或“Compact”樣式(請(qǐng)參閱XtraFolderBrowserDialog.DialogStyle屬性)。

如何使用服務(wù)擴(kuò)展方法

本節(jié)介紹如何使用服務(wù)擴(kuò)展方法的最常見參數(shù)。

對(duì)象視圖模型

 此參數(shù)存儲(chǔ)應(yīng)導(dǎo)航到、在對(duì)話框中打開、托管在新 DocumentManager 文檔中等的子ViewModel實(shí)例。要?jiǎng)?chuàng)建此類實(shí)例,請(qǐng)使用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擴(kuò)展方法的替代方法,該參數(shù)傳遞parent ViewModel的一個(gè)實(shí)例,使用此參數(shù)的擴(kuò)展方法通常也有Parameter參數(shù)。

對(duì)象參數(shù)

 這個(gè)參數(shù)將特定的對(duì)象傳遞給實(shí)現(xiàn)ISupportParameter接口的子ViewModels。實(shí)現(xiàn)此接口的ViewModels具有Parameter屬性,該屬性會(huì)重新計(jì)算此參數(shù)并將其傳遞回調(diào)用方法的位置。

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
方法變化

 共有三種可能的方法參數(shù):viewModel、parentViewModel和parameter。然而,只能有兩種可能的擴(kuò)展方法組合。

  • viewModel:創(chuàng)建一個(gè)子 ViewModel(包括其父級(jí)和必需的參數(shù)),并將該實(shí)例傳遞給 View。
  • 參數(shù)+ parentViewModel:參數(shù)被注入到View中并傳遞給為此View創(chuàng)建的子ViewModel。

對(duì)于后一種情況,可以使用Framework進(jìn)行數(shù)據(jù)注入或者調(diào)用以下方法推遲數(shù)據(jù)注入:

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()
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
国产美女久久精品香蕉69 | 国产精品亚洲综合色区韩国 | 91香蕉视频 | 国产伦精品一区二区三区免.费 | 人妻激情综合久久久久 | 欧美日韩高清一区二区三区电影 | 在线免费视频成人 | 91香蕉app下载免费版 | 国产www久久久久久久 | 精品国产一区二区av果冻传媒 | 国产亚州中文字幕久久网 | 三级三级三级a级全黄三电影 | 国产99久久亚洲综合精品西 | 人妻精品专区久久久久久久 | 国产精品一级在线播放 | 熟女久久久30p | 国产精品日韩幕无码不卡 | 精品无码中出 | 91麻豆国产极品在线观看洋子 | 黑巨人精品一区二区三区 | 69国产成人综合久久精品 | 亚洲成av人片一区二区密柚 | 亚洲无码高清在线观看一区二区三区 | 亚洲aⅴ三级一区二区 | 国产v片在线播放免费无遮挡 | 国产亚洲日韩在线a不卡 | 性少妇freesexvi | 91麻豆精产国品一二三系列产品测评 | 人妻精品日韩一区二区三区 | 国产精品丝袜久久久久久不卡 | 国产裸体舞一区二区三区 | 国产精品白嫩极品久久久久 | 麻豆视频传媒入口 | 91桃色app| 日韩电影免费在线观看网站 | 成人一区二区三区视频 | 午夜a级理论片在线播放不卡 | 日产a一a区二区 | 日韩精品中文字幕无码专区 | 国产视频91在线视频 | 国产乱理伦片免费 | av片在线播放免费 | 91午夜精品久久久久精品 | 无码特色毛片在线播放 | 国产日韩欧美一区二区东京热 | 亚洲av日韩av天堂一区二区三区 | 亚洲成a人片在线观看无码3d | 东京热一区二区三区无码视频 | 中文字幕不卡高清视频在线 | 国产亚洲av片天天在线观看人 | 欧美精品一区二区三区久久久精品 | 国产爆乳美女娇喘呻吟 | 午夜福利免费0948视频 | 欧美日韩国产自在自线 | 日韩精品搭讪在线视频播放 | 精品国产自在久久现线拍 | 国产精品亚洲欧洲人成网站 | 老熟女高潮一区二区三区 | 国产制服丝袜在线无码 | 91成人精品爽啪在线观看 | 色婷婷国产精品欧美毛片 | 91中出 | 东京热蜜桃一区二区 | 韩国精品一区二区三区在线观看 | 91精品尤物在线观看 | 国产在线无码免费网站永久 | 欧美日韩aⅴ精品大片 | 欧美日韩国产免费一区二区三区 | 国产午夜亚洲精品国产 | 精品国产乱码久久久久久毛片 | 国产在线无码精 | 久久成人国产精 | 国产呦精品一区二区三区 | 在线日本视频一区二区 | 亚洲国产欧美日韩精品一区二 | 97国产精品麻豆性色 | 自拍偷区亚洲综合激情 | 99亚洲综合精品久久精品 | 成人麻豆精品激情视频在线观看 | 精品熟女少妇av免费久久 | 国产制服丝袜在线无码 | 日韩欧美一区二区在线播放 | 91麻豆剧传媒国产传媒高清 | 国产不卡福利 | 无码av永久免费专区不卡 | 中文字幕在线观看国产 | 自拍影视乱伦国产 | 国内精品中文 | 国产精品黄色成人 | 国产精品日本一区二区在线 | 成年人高级 | 99久久国产综 | 国产亚洲成在线播放va电影 | 99精品视 | 爱豆传媒高清电影手机在线播放 | 精品国产3p一 | 人妻中文字幕二区 | 国产午夜无码福利在 | 中文字幕+乱码+中文乱码www | 日本一区二区三区视频在线观看 | 精品一区三区视频 | 在线免费观看国 | 在线国产亚洲91 | 久久99精| www深夜成 | 精品人妻出轨久久 | av老司机午夜福利片免费观看 | 国产97在线视 | 国产成人8x视频一区二区 | 在线毛片免费观看 | 欧美成人乱弄视频 | 亚洲综合色成在线播放 | 日韩漂亮素人在线视频观看 | 99久久99久久精品免费看蜜桃 | 精品亚洲欧美视频在线观看 | 国产精品无遮挡永久视频 | 国产成人精品久久 | 亚洲精品乱码久久久久久久久久久久 | 欧美精品久久 | 日本免费看黄 | 久久er国| av无码国产在线看免费网站 | 99视频在线 | 久久99视热频国只有精品 | 91精品欧美激情在线播放 | 97se狠狠狠狠狼亚洲综合网 | 福利姬液液酱:惊人喷水表演 | www男插女在线观看 www欧美无国产精选尤物 | 久久高清精品一区二区三区 | 国产99精品在线观看 | 三年级在线观看免费观看大全 | 91精品国产热久久福利 | 色一情一乱一伦一区二区三欧美 | 亚洲av日韩av综合在线观看 | 69堂在线观看线无码视频 | 99久久精品费精品国产一区二 | 亚洲国产成人av手机在线观看 | 国产免费久久精品99re丫y | 99久久人妻无码精品系列 | 欧美成人午夜免费福利785 | 国产黄大片在线观看画质优化 | 成人欧美日韩一区二区三区 | 国产swagchinh在线观看 | 日本一区二区三区四区在线观看 | 国产午夜精品理论片久久影院 | 婷婷五月 | 99国产精品一 | 护士长在办公室躁bd剧情堪比大片 | 国产熟女性爱 | 亚洲av一级在线免费观看 | 91精品欧美激情在线播放 | 天天爽夜夜春 | 亚洲精品国| 国产在线播放线99视频大全 | 日韩福利视频导航入口 | 日韩综合调教网站 | 91精品国产高久久久久久五月天 | 在线观看不卡无码国产 | 成人国产经典 | 国产激情91久久精品导航 | 国产成人午夜福在线观看 | 区二区三区在线 | 日韩av中文字幕不卡一区在线播放 | 国产三级视频在线观看 | 禁漫天堂不知火舞 | 国产av旡码专区亚洲av | 久草视频免费在线观看 | 香蕉视频网站 | 国产精品ⅴ?在线播放 | 香蕉视频免费在线观看 | 日韩漂亮素人在线视频观看 | 国产在线拍揄自揄拍无码视频 | 亚洲成a人片在线观看国产 亚洲成a人片在线观看老师 | 91精产国品一二三产区 | 国产96在线视频播放网站 | 无码国产精品一区二区免费式芒果 | 国产成年无码v片在线 | 国产免费一区二区三区在线 | 国产亚洲中文日韩欧美综合网 | 国产热久久精 | 少妇被粗大猛进进出出s小说 | 激情综合网+黄色成人网 | 中文字幕av专区 | 特级做a爰片毛片免费看无码 | 在线亚洲精品福利网址导航 | 国产高清超清在线播放 | 波多野42部无 | 老司机91精品网站在线观看 | 精品少妇人妻 | 亚洲av无码专区国产乱码电影 | 97热久久免费频精品99国产 | 成人无码电影在线 | 精品人妻va出轨中文字幕 | 久久av无码 | 91香蕉成人污污污 | 精品人妻一区二区三区含羞草 | 亚洲女人被黑人巨大进入 | 国产户外露出在线观看 | 亚洲av鲁丝片一区二区 | 人人超碰91尤物精品国产 | 亚洲欧美| 国产一区二区日韩欧美在线 | 亚洲欧美人成电影在线观看 | 亚洲av高清 | 国产素人搭讪在线观看 | 亚洲无专砖码直接进入 | 精品亚洲a | 色婷婷综合久久久中文字幕 | 亚洲av一本岛在线播放 | 久草免费版官方最新版下载 | 欧美颜射内射中出口爆在线 | 国产人成网在线播放va | 香蕉久久aⅴ一区二区三区 香蕉久久av一区二区三区 | 国产精品第一页在线观看 | 日韩国产变态另类欧美 | 成人精品一区二区三区电影 | 99久久综合狠狠综合久久aⅴ | 亚洲处破系列在线观看 | av天堂永久资源网 | 中文字幕一区二区三区乱码 | 欧美一级在线播放 | 精品无码av一区二区三区 | 丰满少妇被猛烈进入无码 | 国产三级在线观看播放 | 蜜芽国产尤物?v尤物在线看 | 91精产品自偷自偷综合官网版下载 | 97成人在线视频 | 欧美一区二区三区精品国产 | 99久久综合国产二区高清闺蜜6 | 在线观看一区二区精品视频 | 色婷婷综合久久久久中文 | 日本特黄特大视 | 午夜dv内射一区区 | 午夜国产大片免费观看 | 国产高清无码一区二区 | 婷婷亚洲五 | 91精品天美精东蜜桃传媒入口 | 91精品无人区麻豆乱码 | 国产成人综合亚洲网站 | 99ri视频国产在线观看免费 | 成全视频观看高清在线观看 | 亚洲一区高 | 91色老久久精品偷偷蜜臀 | 99久久免费国产精品2025 | 国产v一区二区久久久 | 日韩无码久久 | 69无人区卡一卡二卡 | 91久久精品国产91久久性色tv | 中文字幕人妻偷伦在线视频 | 成年站免费网站看v片在线 成欧美亚洲人一区二区三区免费 | 日本一区二区免费在线观看 | 日韩午夜无码专区 | 无码一级视频在线 | 日产精品一区二区免费 | 亚洲福利国产精品17p | 99精品一区二区三区免费视频 | 日韩亚洲欧美久久久www综合 | 国产成人精品日本视频 | 精品一区二区三区 | 国产三级精品三级在线专 | 一区二区三区av波多野结衣 | 97精品人人妻人人 | 国产亚洲精品观看91在线 | 亚洲国产精品国自产拍a∨ 亚洲国产精品国自产拍av | 老司机视频在线www 老司机午夜 | 韩国精品视频一区二区在线播放 | 韩国三级中文字幕hd久久精品 | 国产欧美日韩一区二区三区在 | 国产在线视频八区 | 亚洲精品无码久久久影院相关影片 | 日韩精品欧美高清区 | 国产精品日韩无码一区二区 | 亚洲国产精品无码中文字 | 无码a级毛片久久 | 精品自拍视频在线 | 国产区1、2、3有什么区别 | 不卡的神马电影网 | 国产日韩一区美利坚 | 日本精品一区二 | 亚洲精品国产精品国自产 | 爱豆传媒免费全集在线看 | 日本人妻丰满熟妇久久久久久 | 99视频免费在线观看 | 91字幕网app下载 | 国产精品无码一区二区三区不 | 亚洲午夜成人精品电影在线观看 | ww国产 | 亚洲性爱av免费在线播放 | 97人妻起碰免费 | 亚洲中文字幕久久精品蜜桃 | 日韩一区二区三区久久久 | 97爱亚洲综合在线观看 | 91黄色视频免费精品入口 | 国产成人av无码片在线观看 | 国产精品剧情在线 | 国产精品爽爽v在线观看无码 | 亚洲91视| 亚洲欧美日韩国产另例 | 国产主播一区二区三区在线观看 | 久久国产a级久久美女毛片 久久国产v一级毛多内射 | 亚洲欧美日韩中 | 亚洲无码精品在 | 国产成人手机在线视频在线观看 | 色综合久久精品亚洲国产 | 欧美一级二级一区二区 | 中文字幕在文字幕乱码一二三 | 国产精品无码一区二区久久 | 国产av一区 | 亚洲国产福利一区二区三区 | 国产乱子伦视频一区二区三区 | 国产一区二区精品尤物 | 欧美亚洲综合精品 | 99久久国产视频 | 国产欧美精品久久三级 | 91久久精品在这里色伊人68 | 国产永久免 | 91免费在线视频 | 亚洲国产成人久久综合区 | 亚洲无码 | 日韩亚州欧美在线com91tv | 国产精品无码不卡午夜 | 国产精品va无码一区二区三区 | 欧亚乱熟女一区二区三区在线 | 91精品在线观看入口火爆更新 | 99日本精品永久免费久久 | 91a∨精品影库一二三区 | 国产午夜三级一区二区三 | 熟女少妇av一区二 | 国产欧美亚洲三区久在线观看 | 国产成人精品亚洲午夜 | 果冻传媒2025精品视频 | 极品人妖国产ts亚洲一 | 麻豆精品一区二区 | 三级成年网站在线观看 | 精品曰韩av专区一区二区 | 亚洲精品无码久久久久 | 午夜剧场成人免费久久精品 | 中日韩无码水多多影视 | 99精品无人区乱码1区2区3区 | 国产精品天干天干在线综合 | 亚洲亚洲人成综合丝袜图片 | 99re8精品视频| 99久久精品国产一区二区三区 | 久久成人亚洲香蕉草草 | 成a人片亚洲日本久久 | 国产高清黄网站全免费 | 国产在线观看精品一区二区三 | 99热这里是精品与其他应用相比 | 亚洲国产中文精品无码久久 | 亚洲av日韩av永久无码久久 | 日韩视频中文字幕精品偷拍 | 在线观看中出内射人和动物 | 久久99久久久精品 | 成年无码专区在线蜜芽tv | 亚洲国产精品嫩草影院久久 | 91久久精品国产91久久性色t | 丰满少妇被猛 | 国产白丝 | 午夜在线观看亚洲国产欧洲 | 成人免费网站视频www | 国产精品一区二区在线观看 | 老司机免费福利视频 | 精品精品国产理论在线观看 | 敌伦交换一区二区三区流畅不卡顿 | 99久久精品国产毛片 | 99久久人人爽亚洲精品美女 | 97smm迅雷下载 | 国产人妻精品久久久久野外 | 国产高清一区二区三区视频 | 无码任你躁久久久久久老妇双奶 | 国产精品国产三级国产专不∫ | 国产成人无码区免费a∨视频网站 | 99亚洲乱人伦aⅴ精品 | 国产综合这里只有精品 | 亚洲一区二区三区免费在线观看 | 91极品女神嫩模在线播放 | 无码精品一区二区三区在线 | av午夜午夜快憣免费观看 | 丰满的瑜伽老师bd三级 | 精品无码av一区二区三区不卡 | 亚洲日本va中文字幕亚洲 | 人妻少妇精品久久 | 91热久久免费频精品 | 国产在线第一区二区三区 | 欧美综合缴情五月丁香六月婷 | 人人澡人人澡人人看添av | 99久久深夜中文字幕五月婷 | 日韩一区二区三区不卡视频 | 日韩欧美一区二区三区在线视 | 一区二区免费国产在线观看 | 二区三区不卡 | 国产99视频精品免费视看9 | 亚洲国产精品视频 | 99久久免费精品国产72精品九 | 国产乱人伦aⅴ在线a | 国产娇小粉嫩在线观看 | 中文国产日韩欧 | 欧美精品成人a在线 | 在线观看91精品国产 | 国产破外女出血视频全集 | 欧美人与禽2o2o性论交 | 亚洲av久播在线观看 | 国产午夜福利播放 | av狼论坛电视剧在线观看 | 国内精品伊人久久久久av影院 | 国产精品毛片ààààà | 午夜福利一区二区三区不卡 | 91天堂一区二区三区在线观看 | 精品国产a∨一区二区三区在线 | 二区三级国产成人精品人人 | 亚洲欧美一区二区三区国产 | 丰满少妇被猛烈高清播放 | 国产精品无码无在线观看 | 日韩a优精品在线观看 | 国产成人精品无码免费播放 | 亚洲国产精品看片在线观看 | 精品无码超碰动画 | 午夜成人理论无码电影在线播 | 国产产嫖技亚洲精品电影 | 国产人妖网站视频 | 国产99视频精品免费视频36 | 国产午夜精品久久久久婷 | 天堂网www天堂在线中文 | 精品一区二区高清在线观看 | 日韩中文无 | 成人国产第一区在线观看 | 日本码亚洲成a人片 | 国产成人亚洲精品77 | 亚洲无码久久av | 久草免费版官方最新版下载 | 国产电影一区二区三区 | 亚洲成a人片在线观看天堂无码 | 91原创在线观看 | 波多野结衣在线电影天堂 | 毛片久久久久久久久 | 国产成人无码区免费a∨视频网站 | 国产极品 | 久久99久久99| 中文字字幕 | 中文字幕aⅴ | 无码精品人妻一区二区三区爱剪 | 亚洲av| 国产成人av综合久久 | 麻豆国产av巨作国产剧情 | 国产欧美精品va在线播放 | 中文字幕日韩视频在线观看 | 国产三区视 | 老司机精品视频一区二区 | 人妻中文字 | 无码中文字幕a | 久99国产综合精合精品 | 国产精品嫩草影院一二三区 | 91尤物免费在线观看精品 | 成全高清在线播放电视剧 | 亚洲国产精品无码久久久久久曰 | 亚洲阿v天堂202 | 精品99久久久久久999 | 日本三级a∨在线观看 | 无码成人aaaaa毛片ai换脸 | 成人av专 | 在线a网站| 日韩一道本中文字幕 | 欧美日韩亚洲国产精品 | 亚洲精品天堂无码中文字幕 | 在线播放的午夜网 | 国产精品毛毛在线播放 | 国产97在线观看 | 精品国产亚洲一区二区三区 | 亚洲精品一区二区三区午夜不卡片 | 日本高清一区二区三区不卡视频 | 91传媒在线超清免费在线观看 | 97影院午夜在线影国产 | a级国产乱理论片在线观看丶 | 熟妇区毛片蜜桃 | 国产成人av一区二区三区在线观看 | 国产高清色播视频免费看 | 成年私人影院网 | 性做久久久久久久免费看 | 91大神一区二区三区视频 | 精品国产品4k在线网站 | 亚洲熟妇久久无码精品 | 欧美在线视频一区二区 | 国产成人人人97超碰超爽8 | 亚洲av无码乱码一级毛片色欲 | 精品午夜户外露出一区二区 | 一区二区久久 | 国产精品特级露脸av毛片 | 91人人澡人人妻人人精品 | 91视频免费版app下载 | 国产成人在线视频 | 国产精品成人av片免费看网站 | 日韩电影免费在线观看中文字幕 | 愉拍自拍一区首页 | 国产v亚洲v | 国产高潮国产高潮久久久 | 无码精品亚 | 最新国产av无码专区亚洲 | 国产精品亚洲第一区在线观看 | 国产最变态调教视频大全 | 国产剧情日韩 | 国产无遮挡18禁无码网站 | 91伊人| 精品国产免费一区二区 | 97久久草草超级碰碰碰 | 欧美成人精品一区二区三区 | 在线无码专区人妻 | 国产爆乳成| 中文字幕亚韩在线综合 | 亚洲一区二区免费在线观看 | 亚洲a∨无码男人的天堂 | 欧美aaaaaa级午夜福利视频 | 国产精品污www一区二区三区 | 国产精品国产三级国产av剧情 | 神马午夜av午夜一二区 | 黄色软件在线观看 | 日韩欧美成人高清 | 国产探花| 亚洲av无码精品国产午夜久久 | 亚洲国产午夜理论片大全 | 国产性夜夜春夜夜爽18 | 久久99视频精品 | 成年女人a级毛片免费观看 成年女人a毛片免费视频 | 国产在线无码精 | 亚洲v男人的天堂网址在线观看 | 午夜在线视频91精品 | 99久久综合狠狠综合久久aⅴ | 国产在线观看91精品一区 | 99热app最新版本下载 | 成人高清视频51 | 国产v亚洲v天堂无码久久久91 | 国产精品夜间视频香蕉 | 国产旗袍丝袜在线观看 | 国产精品综合久久第一页 | 桃蜜桃av秘无码一区二区三区 | 亚洲av无码一区二区三区在线播放 | 精品国产一区二 | 亚洲日韩中文字综合av | 成人性色生活片免费看爆迷你毛片 | 91久久亚洲亚洲综合精品 | 国产三级电影 | 不卡一区二区三区 | 国产高清av在线播放 | 国产精品永久免费视频 | 精品国产免费看久久久 | 欧美日韩国产中文精品字幕自在自线 | 国产精品成人第一区二区三区 | 日本在线日本 | 国产成人拍精品视频午夜网站 | 深夜网站在线观看 | 高清无码电影免费专区 | 日韩欧美在线播放 | 国产精品国 | 国产三级在线观看播放视频 | 高清一级毛片一本到免费观看 | 国产日韩欧美一区二区东京热 | 怡春院怡红院国产a∨ | 欧美精品日韩 | 丰满大屁股美女一级毛片 | 亚洲а∨天堂2025在线无码 | 狠狠色综合网久久久久久 | 亚洲精品伊人久 | 无码不卡一区二区三区在线观看 | 蝌蚪窝在线观看免费视频 | 99视频免费在线观看 | 色系一区二区三区四区五区 | 午夜无码精品国产片 | 国产无套专区 | 亚洲欧美变态另类综合 | 免费无码黄网站在线看 | 在线免费观看国产 | 精品亚洲aⅴ无码午夜在线观看 | 波多野结衣无码在线观看 | aⅴ片在线观看 | 精品久久久爽爽久久久av | 在线观看免费视频一区 | 超碰在线观看97青草国产 | 国产午夜无码片在线观看影院 | 亚洲影院丰满少妇中文字幕无码 | 国产成人久久精品一区二区三区 | 国产一级婬片aa片免费西 | 国产精品巨作无遮拦 | 午夜日韩欧美在线观看 | 日本精品在线观看 | 日本中文无线码在线观看 | 亚洲男人的天堂av手机在线观看 | 99久久婷婷国产综合精品 | 亚洲中文字幕aⅴ天堂自拍 亚洲中文字幕aⅴ无码天堂 | 人人影视 | 欧美又粗又大又爽又色片 | 91人妻成人精品一区二区 | 欧美日韩人妻精品系列一 | 亚洲av人无码综合在线观看 | 国产激情片免费在线观看 | 国产v一区二区久久久 | 无码一区二区波多野结衣 | 中文字幕乱码永久免费 | 福利姬液液酱涉嫌参与非法活动 | 精品国产亚洲一区二区三区 | 亚洲中文字幕久久无码 | 久久99精品国产是什么意思 | 精品爆乳一区二区三区无码aⅴ | 亚洲精品视频在线播放 | 国产精品高颜值18禁 | 中文字幕在线中文字幕一区 | 熟妇人妻一区二区三区四区 | 欧美日韩不卡高清在线看 | 成人免费v片在线观看 | 欧美深夜福利网站在线观 | 亚洲精品影院在线观看 | 亚洲一区二区三区无 | 久久www香蕉免费人成 | 国产精品中 | 99久久精品出品国产一区 | 国产精品成人一区二区不卡 | 国产精品一区二区 | 亚洲蜜桃视频 | 成全在线观看剧情电影 | 国产成人精品影院 | 超碰爆乳起爆乳中文字幕系列 | 欧美交性又色又爽又黄 | 国产在线ts人妖免费视频 | 99ri日韩精品视频 | 精品欧美在线观看视频 | 日韩av蜜桃永久无码精品 | 免费无码av片在线观看网站 | 国产福利电影一区二区三区 | 91视频最新网址 | 精品91av福利在线观看 | 国产aⅴ无码久久丝袜美腿 国产aⅴ无码专 | 无码久久精品人妻一区二区三区 | 久久www免费人成看片老司机 | 日本高清一区二区在线 | 亚洲日韩精品看片无码 | 99久久久无码国产精品免费 | 91av视频在| 国产美女91呻吟求 | 中文字幕人妻无码乱精品 | 99久久精品国产免费 | 国产亚洲精品国产91 | 老司机精品影院一区二区三区 | 日韩精品系列产品 | 97人妻碰碰碰久久久久禁片 | 国产精品午夜爆乳美女视频 | 精品国精品国产自在久91 | 亚洲jizz | 国产在线98福利播放视频 | 91视频在线| 国产亚洲精品影视在线产 | 欧美区一区二区三区在线视频 | 无套内射在线无码播放 | 私拍一区二区三区 | 亚洲av成人片色在线观看 | 精品无码黑人又粗又大又长 | 深夜免费a级毛片久久 | 精品日本在线免费观看 | 亚洲午夜福利av一区二区无码 | 在线h片 | 日韩av无码成人精品国产 | 国产高清在线观看91了 | 亚洲av成人精品网站在线播放 | 国语自产精品视频 | 国产成人亚洲精品91专区高清 | 国产成人精品免费视频网页 | 国产色系视频在线观看 | 日韩毛片无码永久免费看 | 亚洲男人的天堂一区二区 | 国产av一区最新精品 | 人妻丰满熟妇av无码片 | 精人妻无码一区二区三区 | 日韩亚洲欧美久久久www综合网 | 亚洲日韩国产av无码无码精品 | 亚洲无码在线观看视频免费 | 91精选日韩综合永久入口 | 免费无码肉片在 | 国内精品久久国产 | 国产一级毛片特级毛片国产 | 国产suv精品91| 性欧美暴力猛交69hd | 国产永久免 | 久久不见久久见中文字幕免费 | 少妇一晚 | 精品无码国产自产在线观看水浒传 | 中文字幕免费在线看线人动作大片 | 97久久天天综合色天天综合色h | 国产三a级日本三级日产三级 | 国产福利在线观看片 | 一区二区三 | 色婷婷在线观看视频 | 国产精品99精品久久免费 | 少妇无码v无码专区 | 九九热在线视频观看这里只有精品 | 日韩在线观看视频网站 | 国产强奷在线墦放免费不卡 | 91久久精品在这里色伊人68 | 在线精品动漫一区二区无广告 | 熟女肏互换91视频成人电影 | 日韩欧美系列精 | 国产成人aⅴ国产在线观看 国产成人aⅴ在线免费观看 | 丰满少妇a极毛片视频 | 国产萌白酱在线一区二区 | 久久www免费人成看片入口 | 91精品国产乱码久久 | 天天爽夜夜爽人人爽一区二区 | 国产成人av免费观看 | 在线视频亚洲精品 | 亚洲无码在线 | 91精品国自产在线偷拍蜜桃 | 波多野结衣人妻无码潮喷av | 国产成人无码免费视频97 | 中文字幕乱码亚洲中文在线 | 亚洲乱码av一区二区三区 | 国内精品自在自线视频香蕉 | 亚洲一区二区三区精品动漫在线登录 | 剧情av原创免费 | 99久久久无码国产精品试看 | 精品在线观看三 | 操逼无码 | 日产精品久久久久久久蜜殿 | 亚洲成综合人在线播放 | 国产电影在线观看 | 91亚洲精品在线观看 | 99国产精品欧美一区二区三区 | 深夜久久aaaaa级毛片免费看 | 久996视频精品免费观看 | 国产欧美日韩综 | 九九热精品在线视频观看 | 岛国av无码不卡一区二区三区 | 一区二区视频在线观看高清视频在线 | av男人的天堂在线观看第三 | 日日噜噜夜夜爽爽狠 | 亚洲中文字幕无码久久2025 | 色视频ww| 国产精品91福利一区二区三区 | 国内精品一区二区三区 | 日本a∨东京热高清一区 | 麻豆99激情视频在线播放 | 国产丶欧美丶日韩丶不卡影视 | 91香蕉视频官网 | 国产一区福利姬在线观看 | 国产à爽一区二区久久久 | 麻豆国产福利91在线 | 国产av一级毛片一区 | 欧美精品+在线播放 | 特级做a爰片毛片 | 欧美一区二区三区日韩精品 | 91尤物在线电影 | 在线观看免费播放av片 | 亚洲精品97福利在线 | 国产av色区| 91精产品自偷自偷综合官网版下载 | 色综合网站av综合无码综合网 | 国产视频一区二区三区四区五 | 国产麻豆精品国产传媒av | 欧美系列 | 国产亚洲成av人片在线观看 | 国产精品激情综合五月天中文字幕 | 巨爆乳无码视频在线观看 | 国产视频一区二区三区四区五 | 97精品久久天干天天蜜 | 午夜理论片在线观看免费 | 国产三级精品三级在线观看专 | 精品日韩欧美一区在线播放不 | 国产台湾无码av片在线观看 | 国产中文在线精品亚洲二区 | 国产91免费在线观看 | 99国产成人精品视频久爱成疾 | 国产精品自产拍在线网站 | 亚洲精品亚洲九 | 亚洲精品网站在 | 国产精品无码亚洲 | 午夜桃色| 国产精品美女久久久网站动漫 | 国产女人久久精品 | 国产欧美日本在 | 丰满人妻少妇一区二区三区 | 91午夜精品亚 | 亚洲精品无码久久久久不卡 | 国产黄大片在线观看画质优化 | 国产精品成人一区二区三区 | 婷婷人人爽人人爽人人片 | 国产亚洲精品aaaaaaa片 | 无码aⅴ精 | 午夜视频在线观看 | 成年人在线免费观看视频网站 | 国产精品青青青高清在线观看 | 国产精彩视频在线观看免费蜜芽 | 99精品人妻无码专区在线视 | 精品一区二区久久久久网站 | 国产精品亚洲v毛片一区二区 | 午夜伦情电午夜伦情电影 | 91大神精品长腿在线观看网站 | 99视频在线 | 欧美激情一区二区在线观看不 | 97精品人妻一区二区三区香蕉 | 久别的草原电视剧免费观看高清 | 国内一级 | 在线成年女人免费视频播放器 | 97精品久久天干天天图片 | 日韩人妻熟精品久久无码少年阿 |