超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

logo DevExpress WinForm中文手冊

標準DevExpress服務


立即下載DevExpress WinForms

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.注冊服務。

  • 本地注冊(服務僅在視圖中可用):調(diào)用mvvmContext1.RegisterService方法并將 Service 的Create方法之一作為參數(shù)傳遞。DevExpress MVVM 框架自動注冊最常用的服務——請參閱下面“全局注冊”部分中的注釋。
  • 全局注冊(服務可用于整個應用程序):調(diào)用相應的靜態(tài)MVVMContext.Register…服務方法。
  1. 定義一個ViewModel屬性,返回一個相關(guān)Service接口的對象(例如,如果注冊了WindowedDocumentManagerService,您的屬性應該是IDocumentManagerService類型)。
  2. 使用此屬性可訪問服務并調(diào)用服務方法向視圖發(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框架自動調(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枚舉值來確定要創(chuàng)建的服務類型。
  • CreateMessageBoxService() ——創(chuàng)建一個使用標準WinForms消息框的Service。
  • CreateXtraMessageBoxService() ——創(chuàng)建一個使用DevExpress XtraMessageBox對象的Service。
  • CreateFlyoutMessageBoxService() ——創(chuàng)建一個使用FlyoutDialog對象的服務。

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

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

  • Create(IWin32Window owner, DefaultDialogServiceType type) ——使用DefaultDialogServiceType枚舉值來確定要創(chuàng)建的服務類型。
  • CreateXtraDialogService(IWin32Window所有者)——創(chuàng)建一個顯示可剝皮DevExpress對話框的服務。
  • CreateFlyoutDialogService(IWin32Window所有者)——創(chuàng)建一個顯示flyoutdialog的服務。
  • CreateRibbonDialogService(IWin32Windowowner)——創(chuàng)建一個服務,將帶有嵌入式RibbonControl的RibbonForm顯示為對話框,對話框按鈕顯示為功能區(qū)項目。
  • Create(IWin32Window owner, string title, Func<IDialogForm> factoryMethod)——允許您注冊一個Service來管理自定義對話框(實現(xiàn)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)——接受創(chuàng)建自定義對話框的工廠類。
Public Service Methods

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

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關(guān)閉對話框,如果結(jié)果是UICommand類型,則調(diào)用相關(guān)的UICommand 。請注意,您只能使用最初傳遞到該方法中的對話框服務的UICommand之一ShowDialog。
  • WindowState——這個屬性允許您改變對話框的窗口狀態(tài)(正常,最小化或最大化)。

當前窗口服務

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

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

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

窗口服務

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

如果您想把表單顯示為模態(tài)對話框請在注冊前修改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)——創(chuàng)建一個管理xtraform的服務。

CreateRibbonWindowService(IWin32Window owner, string title = null)——創(chuàng)建一個管理Ribbon窗體的服務。

CreateFlyoutWindowService(IWin32Window owner, string title = null)——創(chuàng)建一個管理Flyouts的服務。

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

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

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

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

DocumentManagerService

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

接口

IDocumentManagerService

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

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

Local Registration

C#:

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

VB.NET:

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

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

Local Registration

C#:

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

VB.NET:

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

窗口文檔管理器服務

允許您添加承載自定義內(nèi)容的新表單。如果服務是用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框架自動調(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ù),框架會嘗試找到一個應該是Service所有者的視圖,在大多數(shù)情況下,使用活動窗口。

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

C#:

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

VB.NET:

mvvmContext1.RegisterService(WindowedDocumentManagerService.Create(tabbedView1))

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

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

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

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

公共服務方式
  • Documents——提供對此服務管理的項集合的訪問的屬性。
  • ActiveDocument——獲取或設置活動項。
  • CreateDocument——創(chuàng)建新項的三個擴展方法,根據(jù)注冊的不同,項目是一個獨立的表單/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)——允許您為此服務設置本地內(nèi)容提供者的擴展方法,當使用此方法創(chuàng)建時,服務將創(chuàng)建新項作為提供者的子項。

公共服務方式

與DocumentManagerService中相同的命令可用,加上以下導航API:

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

DispatcherService

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

接口

管理控件

沒有。

Global Registration

此服務已注冊。

Local Registration

C#:

mvvmContext1.RegisterService(DispatcherService.Create());

VB.NET:

mvvmContext1.RegisterService(DispatcherService.Create())
Create()方法
  • Create()——創(chuàng)建一個新的Service實例。
公共服務方式

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

通知服務

顯示傳統(tǒng)的警報窗口和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)——創(chuàng)建一個使用目標管理器顯示通知的服務,接受ToastNotificationsManager和AlertControl類實例作為參數(shù)。
公共服務方式
  • CreatePredefinedNotification(string header, string body, string body2, object image = null)——創(chuàng)建帶有圖像、標題文本字符串和兩個常規(guī)正文文本字符串的通知。注意,這個方法創(chuàng)建了一個通知,但沒有顯示它——要使它可見,請調(diào)用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 操作系統(tǒng)設置禁用 toast 通知),則該方法會在非UI線程中異步引發(fā)異常,此異常不會影響UI線程。要處理這些異常并響應通知顯示失敗,請ShowAsync使用塊包裝方法的調(diào)用try..catch。

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

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)建一個通知,但不顯示它,要顯示通知,調(diào)用通知的' 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)——創(chuàng)建一個管理目標啟動屏幕管理器的服務。
  • Create(ISplashScreenServiceProvider serviceProvider, DefaultBoolean throwExceptions) ——創(chuàng)建一個服務,該服務管理目標啟動屏幕管理器,并在發(fā)生錯誤時拋出異常。
公共服務方式

ShowSplashScreen(string documentType)—— 顯示啟動屏幕或特定類型的等待表單。“documentType”參數(shù)是從SplashScreen類派生的 ViewModel 的名稱,表示需要顯示的啟動屏幕。如果傳遞null作為參數(shù),則會創(chuàng)建由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) ——將自定義數(shù)據(jù)注入當前可見的啟動畫面或等待表單的方法,SetSplashScreenProgress方法更新啟動屏幕進度條,SetSplashScreenState發(fā)送任何其他類型的數(shù)據(jù)(例如,啟動屏幕標簽的字符串數(shù)據(jù))。
啟動畫面

啟動畫面可以利用這兩種方法,要接收和使用注入的數(shù)據(jù),請使用啟動屏幕管理器的智能標簽菜單添加新的啟動屏幕。啟動屏幕的代碼包含“覆蓋”區(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ā)送到啟動屏幕和等待表單。為此,請使用簡單對象(字符串、數(shù)值等)作為方法參數(shù),執(zhí)行此操作時,SplashFormBase.ProcessCommand方法將接收這些簡單對象作為arg參數(shù),并接收DemoProgressSplashScreen.CommandId枚舉器值作為cmd參數(shù),檢查cmd參數(shù)來確定哪個命令發(fā)送到您的啟動屏幕并相應地使用arg值。

下面的 ViewModel 代碼調(diào)用SetSplashScreenState方法來傳輸閃屏標簽的“幾乎完成...”字符串。“ SetSplashScreenProgress ”發(fā)送當前(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參數(shù)的CommandId.MVVMSetState值調(diào)用ProcessCommand重寫。SetSplashScreenProgress方法調(diào)用ProcessCommand重寫兩次:首先,cmd參數(shù)返回 CommandId.SetProgressValue;其次,cmd參數(shù)返回 CommandId.SetProgressValue,讀取這些參數(shù)值并應用來自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

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

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

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

C#:

public enum SplashScreenCommand {
StateLabelCommand,
PercentLabelCommand,
ProgressBarCommand
}

VB.NET:

Public Enum SplashScreenCommand
StateLabelCommand
PercentLabelCommand
ProgressBarCommand
End Enum

這些自定義枚舉器值標記來自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)在附帶了相應的枚舉器值,因此可以確定arg參數(shù)中存儲了哪些數(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

下圖展示了一個帶有進度條和兩個標簽的啟動畫面,這三個元素使用SetSplashScreenState方法更新。

Startup screen
等待表單

要顯示等待表單,使用相同的ShowSplashScreen和SetSplashScreenState方法。表單有兩個標準的文本塊——標題和描述,因此SetSplashScreenState應該傳遞一個在Wait Form的ProcessCommand方法中解析的雙字符串數(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

打開并保存文件對話框服務

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

接口

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()——創(chuàng)建一個文件對話框服務。

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

公共服務方式
  • ShowDialog(Action<CancelEventArgs> fileOK, string directoryName)——顯示當前對話框服務,如果文件成功打開(保存),則執(zhí)行fileOK回調(diào),可選的directoryName參數(shù)指定啟動對話框文件夾,對于 SaveFileDialogService,第三個字符串 fileName參數(shù)也可用,該參數(shù)指定保存文件的默認名稱。
  • MultiSelect ——一個布爾屬性,指定是否允許用戶同時打開多個文件(僅限 OpenFileDialogService)。
  • OverwritePromt —— 一個布爾屬性,指定當您嘗試保存名稱已存在的文件時是否顯示確認消息(僅限 SaveFileDialogService)。
  • Title —— 指定對話框標題的字符串值,此屬性和以下所有屬性均繼承自FileDialogService基類。
  • DialogStyle——允許您在常規(guī)的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()——創(chuàng)建文件夾瀏覽器對話框服務的新實例。

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

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

如何使用服務擴展方法

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

對象視圖模型

此參數(shù)存儲應導航到、在對話框中打開、托管在新 DocumentManager 文檔中等的子ViewModel實例。要創(chuà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擴展方法的替代方法,該參數(shù)傳遞parent ViewModel的一個實例,使用此參數(shù)的擴展方法通常也有Parameter參數(shù)。

對象參數(shù)

這個參數(shù)將特定的對象傳遞給實現(xiàn)ISupportParameter接口的子ViewModels。實現(xiàn)此接口的ViewModels具有Parameter屬性,該屬性會重新計算此參數(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。然而,只能有兩種可能的擴展方法組合。

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

對于后一種情況,可以使用Framework進行數(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
利記足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 最大網(wǎng)上PM娛樂城盤口(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 正規(guī)雷火競技官方買球(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 雷火競技權(quán)威十大網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) boyu·博魚信譽足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 權(quán)威188BET足球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 正規(guī)188BET足球大全(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機版登錄入口-最新版(已更新) 91精品国产网曝事件门 | 国产精品高清一区二区 | 国产1区2区3区国产精品 | 激情欧美日韩一区二区 | 国产午夜片无码区在线观看 | 国产高潮美女出白浆在 | 91精品一区二区三区在线观看 | 国产性爱在线视频一区二区 | 岛国在线永久免费视频 | 91精品国产免费无套国产 | 国产成人久久综合麻豆 | 国产午夜羞羞小视频在线观 | 国产依人在线观看视频 | 国产在线线宅男网站啪哩 | 国产成人年无码av片在线观看 | 成人午夜精品久久久久久久小说 | 国产无码第一页国产视频在 | 韩国美女精品一区二区三区 | 国产成人五月综合网 | 国产高潮抽搐翻白眼在线播放 | 18禁美女黄网站色大片免费 | 精品国产一区二区三区无码 | 国产成人精品亚洲日本语言 | 国产a级一级毛片 | 精品无码国产一区二区日本 | 2025国语电影免费在线观看 | 国产肥妇无码精品视频 | 国产无套乱子伦精彩无码视频 | 国产精品美女久久久久久久 | www夜片内射视频日韩精品成人 | 丰满爆乳无码一 | 2025久久精品国产99国产精品 | 国产日本精品在线观看 | 成人动漫视频在线观看 | 91在线播放| av无码最新在线播放网址 | 成人无码h免费动漫在线观看 | 成人片黄网站a毛片免费观看 | 丰满人妻久久中文字幕免费 | 激情欧美成人久久综合 | 成人无码区免费a片在线软件 | 国产福利vr专区精品 | 2025国产精品极品在线 | 成人午夜电影免费完整在线看 | 精品国产三级久久久久三级 | 精品少妇人妻av无码专区偷人 | 国产成人午夜福利在线播放 | 国产无套gv在线观看 | 99久久无码精品一区二区毛片 | 二区三区好的精华液杨超越 | 激情小视频一区二区三区 | 国产精品另类激情久久久免 | 国产毛片特级av片 | 国产成人免费观看 | 国产午夜激无码av毛片不卡 | 国产二级一片内射视频播放 | 99久久精品人妻 | 精品国产一区二区久久久蜜臀 | 国产欧美日韩视频在线观看一区二 | a级毛片在线观看 | 国产成人无码一区二区三区在线 | 国产综合免费精品久久久 | 国产精品白嫩在线观看 | 国产经典偷自视频区视频 | 国产成人综合亚洲天堂 | 国产巨臀系列在线观看 | 国产va欧美va在线观看 | 国产99久久亚洲 | 国产免费无码一区二区三区vr | av动作片免费无码 | 精品无码自拍视频在线观看 | 国产成人综合亚洲欧美 | 精品麻豆国产色欲色欲 | 国产美女激情作爱网站 | 黑色丝袜脚足国产在线看 | 国产午夜小视 | 国产高清一区二区 | 99久久国产精品无码 | 丰满少妇人妻hd高清 | 极品人妻少妇一区二区三区 | 精品日韩av一区无码 | 3d成年av动漫网站 | 91蜜桃国产成人精 | 国精产品一区一区三区免费视频 | 国产av无码无遮挡毛片 | 国产成人精品无码一区二区三区 | 国产成人无码剧情久久久久 | 国产日韩欧美女同一区二区 | 精品国产在线 | 国产午夜亚洲精品一级在线 | 91人妻中文字幕无码专区蜜 | 国产女主播喷水视频在线观看 | 2025国产麻豆剧传媒免费 | 成人午夜一区二区三区视频 | 高清无码一区二区在线观看吞 | 国产精品亚洲电影久久成人影院 | 91精品在线免费视频 | 精品国产一级精品毛片基地 | 国产精品免费精品自在线观看 | 精品无码国产av综合 | 国产99久久影院电影 | 成人无码精品1区2区3区 | 2025国产精品极品色在线 | 国产午夜精品一二区 | 国内精品伊人久久久av高清影 | 91久久久精品无码国产一区 | 国产精品亚洲综合久久小说 | 国产精品一区二区手机看片 | 99ri视频一区二区三区 | 国产成a人亚洲精v | 国产午夜免费福利红片 | 91麻豆国产在线 | 99久久精品一区二区三区 | 福利一区二区三区视频在线观看 | 国产a毛片aaaaaa | 高潮爽到爆好爽无码喷水视频 | 国产精品免费播放 | 国产一区二区在线观看麻豆 | 国产黄色带三级在线观看 | 寡妇高潮一级毛片91免费看`日 | 精品人妻视频一区二区三区 | 国产高清一区二区三区免 | 18国产精品白浆在线观看免费 | 国产成人黄网站在线观看软件 | 成年女人粗暴毛片免费观看 | 国产丝袜不卡一区二区 | 18禁黄污无遮挡无码网站 | 91精品国产自产在线啪免费 | 91麻精品| 2025中文字幕在线无码视频 | 国产三级九九久久久久三级 | 国产精品国产三级国产àn不卡 | 精品国产黑色丝袜高跟鞋 | 国产一区欧美日韩另类 | 丰满人妻久久中文字幕免费 | 成人做受视频试看60秒 | 国产萌白酱喷水视频在线观看 | 国产精品午夜剧场免费观看 | 国产精品亚洲视频在线观看 | 国产交换配乱婬视频 | 丰满熟女人妻中文字幕免费 | 精品无码久久久久国产 | 99久久久无码国产精精品免费 | 精品亚洲av无码 | 2025亚洲国产精品无码 | av制服丝袜白丝国产网站 | 动漫精品专区一区二区三区不 | 国产精品亚洲av色欲三区 | av无码国产精品色午夜 | 国产日韩一区二区三区 | 国产精品免费麻豆入口 | 国产成人精品高清 | 国产精品一区二区三区高清 | av人片一区二区密柚 | 国产麻豆精 | 国产高清在线观看av | 国产成人免费视频在线网站 | 精品无码久久91毛片视频 | 韩国精品一区二区三区四区 | 国产欧美高日韩精品久久一区二区 | 国产精品毛多多 | av无码久久久久久不卡网站 | 国产成人女人毛片视频在线 | 精品国产一区二区三区久 | 国产观看精品一区二区三区 | 国产日韩另类中字 | 国产对白精品刺激一区二区 | 变态另类清纯唯美中文 | 国产中文字幕免费视频 | 精品福利一区二区在线 | 国产爆乳美女娇喘呻 | 精品韩国三级在线观看视频 | 国产成人a∨无码 | 国产精品免费高清观看 | 国产精品一区欧美日韩制服 | 国偷自产av一区二区三区 | 国产成a人亚洲精v品无码樱花 | 国产亚洲成av片在线观看 | 国产精品无码专区在线播放 | 二区三区视频 | 动漫精品无码视频一区二区三区 | 99久久精品国产 | 国产一级一级一级国产片 | 国产欧美日韩视频一区二区三区 | 国产成人av网站网址 | 国产91调教在线观看 | 国产一区二区三区不卡av | 国产无套乱子伦精彩是白视频 | 爆乳美女脱内衣 | 91福利院| 国产人妻人伦精品无码.麻豆 | 国产sm调教视频在线观看 | 精品美女视频免费直播 | 国产一视频在线观看 | 91日本在线中文字幕 | 精品国偷自产在线 | 精品五月天六月花一区二区 | a性色生活片久久毛片牛牛 a亚洲va老司机 | 国产av动漫一二区 | 国产亚洲欧洲日韩在线91区 | 国产精品一区伦免视频播放 | 国产精品一区欧美日韩制 | 国产av熟女 | 国产在线拍揄自揄视精品 | av片亚洲国产男人的天堂 | 成人无码一区二区三区 | 国产精品无码福利午夜专区 | 国产欧美久久久精品 | 爆乳亚洲一区二区 | 韩国和日本免费不 | av片日韩一区二区三区在线观看 | 精品3d动漫视频一区在线观看 | 国产精欧美一区二区三区久久久 | 爆乳美女脱内衣18禁裸露网站 | 国产美女人喷水在线观看 | 国产一级久久 | 国产在线无遮挡的免费视频 | 91麻豆视频| 成人一区二区在线 | av一区二区三区在线播放 | av无码天堂一区二区三区 | av中文字幕在线亚洲 | 大香蕉日韩一区二区三区 | 18禁无码av免费不卡 | 国产放荡对 | av无码一区二区三区鸳鸯影院 | 1024看片福利永久国产 | 国产成人综合在线观看不卡 | 国产黄三级精品在线观看播放 | 国产成人精品免费视频大全麻 | 国产最火爆久久久久国产一级毛片 | 国产精品视频高清在线播放 | 国产黄a级三级三级看三级 国产黄a三级三级三级 | 国产精品亚洲伦理在线 | 国产综合在线视频一区二区 | 国产成在线观看免费视频成本人 | 国产超碰人人做人人爽av | 国产精品熟女四五十路一区二区 | 国产亚洲漂亮白嫩美女在线 | 精品少妇人妻av免费久久 | 国产精品高清一区二区三区人妖 | 国产无套码aⅴ在线观看在线播放 | 18禁漫画在线 | 国产无套视频在线观看香蕉 | 国产在线观看高清不 | 国产成人精品一二三区 | 国产成人无码午夜视频在线观 | 国产在线观看av福利 | 国产免费无码v片在线观看不卡 | 国产v无码专区亚洲v桃花庵 | 国产福利一区二区三区四区 | 国产成人精品一区二区三区免费 | 国产成人欧美日本在线观看 | 国产一区二区三区中文在线 | 国产美女视频免费的黄片 | 国产精品毛片一区二区 | 18国产精品白浆在线观看免 | www.国产成人在线观看 | 99国产欧美久久久精品蜜芽 | 91久久精品无码一级毛片 | 国产精品高潮呻吟88av | 国产亚洲欧美激情久久电影 | 国产精品高潮露脸在线观看 | 国产偷伦视频在线 | 国产无码在线看免费 | 东京热人妻av中文系列 | 国产精品一区在线 | 国产精品亚洲一区二区在线观看 | 国产成人年无码国产亚洲小说 | 国产欧美精品一区二区三区四区 | 国产日韩亚洲欧洲一区二区三区 | 国产成人精品午夜二三区波多野 | 国产福利一区二区精品免费 | 国产一区二区三区在线免费观看 | 国产99久久久国产精品免费看 | 国产成人免费影片在线观看 | 精品国产三级av久久久 | 国产一区二区高清无码 | 国产野战无套av毛片 | 国产成人啪精品视 | 精品国产中文自拍 | 成人av无码一区二区三区 | 91久久国产综合久久91大便 | 成a人影片免费观看日本 | 高清欧美日韩一区二区三区在线 | 国产午夜无码片在线观看影视 | 91av在线观看国产日本视频 | 精品无码高潮喷水a片 | 波多野结衣中文字幕一区二区 | 97无码人妻免费视频碰碰碰 | 成人精品视频一区二区 | av无码网址 | 国产秘麻豆果冻传媒 | 国产孕妇孕交一级毛片 | 国产成人精品.一二 | 国产成人精品一区二区三 | 国产成人亚洲精品电影香蕉 | 国产在线精品无码不卡手机免 | 高清无码色色视频 | 国产一区二区三精品久久久无广 | 国产夜色福利院在线观看免费 | 国产大爆乳大爆乳在线播放 | 囯产极品美女高潮无套久久久 | 国产精品福利一区二区久久 | 国产成人无码免费看片软件 | 国语自产偷拍精品视频 | 国产a级作爱片免费看 | av无码中文一区二区三区四区 | 成人精品欧美一区二区三区 | 国产激情无码视频在线播放性 | 国产不卡高清在线观看视频 | 18禁无遮挡肉动漫在线播放观看 | 国产成人av剧情自拍网站 | 国产三级2025在线观看 | 国产爆乳无码视频在线观看 | 国产日韩av在 | 国产午夜亚洲精品三区 | 国产免费高清视频在线观 | 国产成人手机在线视频在线观看 | 精品人妻中文字幕无码二区三区 | 国产一区二区三区91 | 国产av高清和老师偷尝禁果 | 国产成人调教在线视频 | 国产精品毛片一区二区三区在 | 国产一区二区日韩一区二区 | 99精品国产福久 | 国产偷伦视频高清完整版 | 国产一区二区在线午夜福利 | 国产福利精品一 | 精品国产一区二区三区成人 | 国产美女黄性色av | 国产无套粉嫩流白浆不卡 | 2025免费在线手机影院 | 成人一区二区免费中文字幕视频 | 国产无套码aⅴ在线观看在线 | 国产依人在线观看视频 | 国产人妖乱国产精品人妖 | 成人午夜电影在线播放网 | 国产欧美久久精品不戴乳罩 | 国产色视频在线观看免费 | 国产精品视频一区二区首页 | 国产欧美日韩资源在 | 成人亚洲天堂 | aa无码在线免费 | 99久久精品国产高潮 | 精品人妻中文字幕 | 国产精品淫水呻吟女王调教 | 国产精品一区二区公司 | 成人国产精品免费视频 | 激情都市亚洲一区二区 | 国产精品亚韩精品无码a在线 | 97精品国产自产在线观看 | 99久久无码一区 | 国产电影一级视频在线 | 丰满少妇大乳高潮在线 | 国产精品欧美亚洲日本综合 | 国产高清无密码一区二区三区 | 超级在线人妻 | 国产成人精品一区二区 | 精品国产一区二区三区日日嗨 | 国产在线观看91精品 | 91无码人妻丰满熟妇区五十路 | 91在线无码精品秘入口九色 | 加勒比无码专区 | 国产成a人片在线观看视频99 | 91精品国产福利在线观看麻 | 国产日韩亚洲不卡高清在线观看 | 国产综合成人久久大片 | 国产午夜激无码 | 成人免费在线观看毛片 | 国产午夜片无码区在线观看爱情 | 国产美女裸身无遮挡网站 | av无码国产在线观看岛国 | 国产伊人网 | 国产真实自在自线 | 18禁男女无遮挡啪啪网站 | 国在线产香蕉精品青青 | 国产精品一区二区久久精品不卡 | 国产91精选在线观看麻豆 | 国产激情精品一区二区三区 | 国产美女视频免费观看的网站 | 国产一区二区啪啪啪免费视频 | 国产一区二区三区正品 | 成人毛片高清视 | 国产av永久精品无码 | 精品91自产拍 | 国产精品露脸精 | 91人妻人人做人碰人人爽 | 91蜜桃国产 | 国产精品视频高清在线播放 | 精品毛片久久久久久一 | 国产激情一区二区三区在线 | 91精品国产情侣高潮露脸 | 妇女精品一二区 | 国产午夜福利电影在线 | 国产在线观看91精品一区 | 成人欧美一区二区三区黑人免费 | 国产高清无码视频专区 | 高清无码不卡一区二区三区 | 精品无人区麻豆 | 高潮视频免费观看 | 国产精品视频无码 | 国产偷窥盗摄一区二区 | 国产精品成人亚洲一区二区 | 91精品国产乱码在线观看入 | 国产精品熟女人妻一区二区三区 | 国产精品成人99一区 | 精品无人区麻豆乱码1区2区 | 国产精品三级女人国产香蕉 | 国产精品视频在线观看 | 国产成人av丝袜在线播放 | 国产精品日韩欧美在线 | 国产成人免费永久播放视频平台 | 精品丰满爆乳熟妇av免费播 | 91精品国产自产91精品蜜臀 | 国产激情无码一区二区在线看 | 国产精品久久久久久久久久日本 | 国产极品美女无套内射 | 国产一区二区三区免费看视频 | 成人无码区免费a∨直播 | 2025韩国午夜福利片在线观看 | 国产成本人在线无码 | 国产在线精品国自产拍影院午夜 | 精品国产v无码 | 国产精品偷窥熟女精品 | 国产在线观看av直播 | 91在线国产一区二区 | 91九色在线播放 | 国产99精品在线观看 | 国产成人做受免费视频 | 国产麻豆精品免费密入 | 国产成人免费视频播放在线观看 | 91在线国产综合 | 国产在线精品第一区二区 | 国产经典一区二区三区蜜芽 | 成人午夜精品网站在线观看 | 91露脸对 | 韩国免费a级作爱片在线观看 | 国产精品亚洲专区无码性色 | 精品亚洲国产成人蜜芽av小说 | 国啪产自制福利2025 | 国产免费又黄有色在线观看 | 国产精品一区二区久久蜜臀内射 | 国产一区二区三区亚洲精品 | 国产精品高潮森林久久av无码 | 2025国产精品毛片久久 | 成人精品视频一区二区三区不卡 | 99久久婷婷国产综合精品 | 国产精品国三级国产av | 国产超级va在线观看视频 | 国产中文字幕无码人妻 | 国产精品国三级国产av视色 | 国产精品视频一二三四五 | 国产精品制服丝袜电影 | 国产午夜毛片一区二区三区 | h无码无修动漫在线观看 | 国产美女午夜区一区二区三区 | 国产成人啪视频一区二区三区 | 国产91在线观看网站 | 京野结衣免费一区二区 | 国产三级在线观看免费 | 国产精品不卡在线观看 | 91精品资源在线观看 | 精品熟女少妇av久久免费 | 国产精品无码播放 | 2025精品国产综合久久 | av在线无毒免费观看 | 97色综合| 国产精品一区99国产aaa精 | av午夜福利一 | 国产超a级动作大片中文字幕 | 囯产精品视频一区二区三区99 | 韩国三级中文电影在线观看 | 国产免费伦精品一区二区三区 | 国产欧美综合在线男人的天堂 | 成人精品一区二区久久 | 精品无码国产一区二区三区avw | 国产一区二区在线影院 | 潮喷大喷水系列无码久久精品 | 国产无码一区二区三区不卡视频 | 国产一级毛片大陆 | 国产福利区一区二 | 精品亚洲a∨在线播放不卡 精品亚洲aⅴ无码午夜在线 | 高清无码中文字幕乱码 | 国产在线第一浮力影院 | 91亚洲中文天| 国产午夜精品不卡观看 | 国产成人一区二区三区影院 | 国产vr在线视频一区二区不卡 | 国产av无码专区亚洲a√ | 91久久国产| 91精品国产调教在线观看 | 国产一区二区三区日韩欧 | 高清无码黄色视频在线观看 | 国产高清一级a片在线视频 国产高清一级黄色片 | 91成人爽a毛片一区二区动漫 | 国产黄视频网站 | 国产一区二区精品福利地址 | 国产精品一区在线麻 | 国产亚洲成aⅴ人片在线奶水 | 91麻豆精品国产自 | 国产精品视频一区国模私拍 | av无码av在线a∨天堂毛片 | 国产精品国产三级国产av品爱网 | 国产精品高清另类一区二区三区 | 成人无码精品一区二区在线 | 精品无码国产一区二区三区麻豆 | 国产无码精品免费视频免费 | 成人欧美一区二区三区在线 | 国产呦精品一区二区三区下载 | 国产精品亚洲产品一区二区三区 | 国产一区二区久久 | 韩国三级大全久久网站 | 国产97碰 | 精品国产sm捆绑最大网免费 | 91人妻人人澡人人爽人人精品 | 国产一区二区在线不卡 | 2025国产乱人伦在线播放 | av综合在线综合导航 | 国产精品爽爽va在线观看网站 | 18禁成年宅男午夜网站 | av无码久久久久不卡 | 国产偷伦视频中文精品免费 | www国产成人免费观看视频 | 北岛玲日韩精品一区二区三区 | 国产亚洲专区在线观看 | 成人午夜福利片 | 精品国产一区二区三国产 | 91麻豆产精品久久久 | 丰满少妇内射一区 | 国产欧美精品一区二区三区涩涩 | 国产在线精品成人一区二区 | 国产精品制服丝袜 | 国产成人av无码在线 | 成人va在线一区二区三区四区 | 91精品福 | 91精品国产99久久青草蜜桃 | 丰满少妇人妻无码专区 | 高清不卡av一区二区 | 黄桃av无码免费一区二区三区 | 国产无码一区二区三区 | 韩国久久九九精品 | 成人国产综合 | 国产亚洲日韩网曝欧美11 | 国产自国产在线观看免费观看 | 国产成人精品日本亚洲专一区 | 国产99久久久国产精品免 | 国产精品观看视频免费完整版 | 国产午夜精品在人线播放 | 国产在线91手机观 | 国产福利片无码区在线观看 | 国产三级在线视频播放线 | 精品国产成人三级在线观看 | 国产成人亚洲精品91专区手机 | 国产精品国产对白熟妇 | 国产自拍成人激情视频 | 高清一区二区三区视频 | 国产麻豆剧传媒精品国产av | 国产护士囗交吞精视频 | 国产亚洲精aa在线观看see | 国产亚洲精久久久久久叶玉卿 | aⅴ无码一级a片在线视频免费 | 国产午夜精品久久久久精 | 国产精品美女久久久久网站 | 国产一区二区三区在线观 | 97人妻人人做人碰人人爽 | 91精品成人福利在线播放 | 91午夜福利国产 | 国产熟女露脸大叫高潮 | 国产自在自线午夜精品视频 | 国产超碰āv人人做人人爽 国产超碰女人任你爽 | 国产黄色精品观看 | 国产精品流白浆在线观看 | 精品人妻中文字幕无码二区三区 | av中文字幕一区二区三区久久 | 国产午夜影视大全免费观看 | 国产尤物在线视精品在亚洲 | 国产精品久久久精品 | 97人妻免费视频播放 | 国产亚洲欧美日韩久久图片 | 国产精品亚洲日韩aⅴ在线 国产精品亚洲日韩aⅴ在线观看 | 91久久久精品无码国产一区 | 92午夜福利影院一区二区三 | 国产a亚洲欧美 | 国产av.一区 | 东京热av无码 | 国产欧美另类久久久精品91 | av在线播放你懂的 | 精品少妇无码一区二区三区免费 | 国产高清不卡免费视 | 精品国产乱子伦一区 | 国产深夜福利在线免费观看 | 国产精品亚洲午夜一区二区三区 | 国内外无码视频 | 国产精品国产精品国产专区 | 国产一区自拍视频在线观看 | 国产精品成人精品天天看视频 | 丰满熟女少妇午夜福利视频 | 国产成人av大片在线观看 | 国产高清在线观看一区二区三区 | 国产一区二区成人电影 | 2025麻豆福利午夜久久 | 国产精品制服丝袜四区 | 国产区精品尤物柚木在线 | 国产精品一区二区免费在线观 | 国产午夜福利三级 | 国产亚洲一区交换在线 | 国产精品人妻一区二区三区a | 国产亚洲欧美精品永久 | 国产高清视频免费观看 | 国产亚洲成aⅴ人片在线观看麻豆 | 国产经典在线观看一区 | 国产高清午夜自在在线 | 国产成年无码a影片 | 国产美女免费视频 | 国产免费永久精品无码 | 国产无码毛片一区二区三区 | 国产成年人免費黄色視頻 | 国产av无码字幕制服高清 | 国产精品无码专区在线观看 | 国产美女爽爽爽免费视频电影 | 99久久综合狠狠综合久久 | 国产午夜怕怕 | 韩国精品无码一区二区三区视频播放 | 精品国产三级大全在线观看 | 高清无码国产精 | 国产雏女破苞在线播放 | 高清a无码在线观看 | 国产成人女人毛片视频在线 | 国产午夜理论不卡在线观看 | 国产激情久久久久影院小草 | 国产高清白嫩在线播放 | 国产三级精品在线 | 国产精品三级视频 | 91精品久久久久无码午夜福利 | 国产主播一区二区三区在 | 国产暴力一区二区三区 | www.脏片| 国产精品日韩专区 | 国产成人av网站网址 | av在线中文字幕不卡电 | 国产精品偷伦免费观看的 | av在线亚洲男人的天堂 | 成人国产一区二区 | 国产成人愉拍精品 | 国产产无码乱码精品久久鸭 | 91精品国产综合久久小美女 | 国精品无码一区二区 | 岛国毛片一级一级特 | 国产成人小午夜视频在线观看 | 国产激情无码视频在线播放性色 | 国产女性无遮挡免费裸体视频 | 国产尤物无码一区二区 | 91久久精品无码一级毛片 | 国产精品无码久久久久久久久久 | 国产精品无码久久aⅴ裸体 国产精品无码久久av | 国产成人无码情景av | 国语自产偷拍精品视频偷拍 | 国产免费高清在线视频观看网 | 国产av美女激情 | 国产精品福利区一区二区三区四 | 国产成人精品福利网站 | 国产一视频在线观看 | 国产麻豆雪千夏在线观看 | av在线观看网址 | 97人妻碰碰视频免费上线 | 99国产精品电影 | 国产aⅴ天堂亚洲国产a | 国产不卡视频一区二区三区四区 | 成人午夜男女爽爽影院 | 国产精品多p对白 | 国产精品无码一二三 | 成人免费播放视频 | 国产精品va在线观看无码电影 | 精品国产福利第一区二区三区 | 国产三级国产精品国产普男人 | 2025国产精品成人免费视频 | 国产孕妇福利3在线观看 | 国产精品户外野外亚洲av又 | 国产成人无码短视频在线观看 | 国产精品日本一区二区在 | 国产在视频在线观看 | 国产最爽的av片在线观看 | 精品色综合久久综合天天 | 东京热高清无码系列 | 国产欧美日本一区二区三区免费 | 国产亚洲欧美日韩剧的剧情介绍 | 国产成人女人毛片 | 国产免费无码一区二区三区 | 精品白浆无码流出在现看 | 国产福利秒拍一区二区在线观看 | 按摩已婚人妻中文字幕[猫腻] | 国产精品一区在线 | 丰满人妻久久中文字幕免费 | 国产精品毛片 | 国产福利不卡一区二区三区 | 国产在线精品一区二区高清 | 成熟女人毛片www免费版在线 | 国产成人啪视频一区二区三区 | 国产在线精品无码 | av无码资源 | 国产无码自拍高清小电影 | 成人自拍乱拍在线视频 | 91妻友:夫妻交友新体验 | 国产一区二区草草影 | 国产极品粉嫩在线观看的软件 | 高清国产在线播放91 | 国产精品对白交换绿帽视频 | 国产欧美另类久久 | 国产剧情中文字幕一区二区 | 国产精品亚洲专区无码影院 | 国产成人永久免费播放视频 | 91在线码无精品秘入口九色 | 国产精品自产拍在线观看中文 | 91麻豆产精品久久久久久夏晴子 | 国产无套粉嫩白浆在线观看 | 国产午夜高清高清在线观看 | 国产高清一区二区三区直播 | 东京热久久综合久久 | 国产无码精品第8页 | 国产91精品成人 | 国产午夜精品一本在线观看 | 2025久久国产精品毛片 | 国产黄片免费观看 | 护士av无码在线观看 | 国产尤物在线视精品在亚洲 | 国产精品成人久久 | 国产+日韩+另类+视频一区 | 国产毛片特级av片 | 国产一区二区三区高清av | 国产69精品久久久久观看软件 | 国产精品高潮呻吟久久 | 国产丝袜一区 | 精品丝袜永久综合国产 | 激情综合中文无码 | 国产成人综合亚洲色就色 | 精品推荐制服丝袜第一页 | 国产精品全国免费观看高清 | 国产精品女人呻吟白浆在线观看 | 国产综合自拍 | 精品无码久久91毛片视频 | 99久久国产精品一区二区 | 国产女人喷浆 | 高清无码午夜福利视频 | 国产精品成人av在线不卡 | 国产美女一级日逼大片 | 国产综合久久久久久鬼色 | 国产高清视频在线观看不卡v | 国产91在线播 | 国产欧美日韩一区二区刘玥 | 国产午夜精品久久久久精品电影 | 国产欧美精品一区二区三区四 | 成人无码精品一区二区三区 | 精品国产欧美另类一区 | 91福利国产门事件在线观看 | 国产精品极品美女自在线观看免 | 国外成人在线视频 | 国产成人精品视频午夜 | 国产免费人视频在 | 国产一区亚洲二区 | 91在线无码精品秘入口色欲 | 国产一区二区美女自卫 | 国产毛片一区二区 | 国产福利乳摇在线播放 | 丰满少妇一区二区 | www国产精品内射老熟 | 国产丝袜在线精品丝袜不卡 | 91在线免费看 | 国产一区内射最近更新 | 变态另类欧美大码日韩 | 国产喷水女王 | 精品久久久无码中文字幕av | 91视频免费看平台有哪些优势 | 国产一区二区精品 | a级毛片免费看 | 国产综合精品无码久久 | av无码a一在 | 国产激情久久久久影院小草 | 国产精品精品自在线拍 | 精品国产免费一区二区三区 | 成人一区二区三区 | 国产精品免费看久久久无码 | 国产主播一区三区在线 | 国产在线观看高清看片 | 大片精品一区二区三区 | 国产囗交口爆吞精在线视频 | 69成人av在线播放 | 国产在线高清视频无码不卡互動交流 | 国产精品国产三级传区网站 | 国产精品偷伦费观看 | 国产精品偷伦视频观看免费入 | 国产精品黄大片在线播放 | 丰满女邻居的嫩苞张开视频 | 99国产亚洲精品美女久久久久 | 国产91丝袜在线播放动漫 | 国产小视频网在线播放 | 91大神精品网站在线观看 | 91精品无码人妻在线 | 国产99久久亚洲 |