精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

WPF漂亮界面框架實現原理分析及源碼分享

開發 架構
WPF漂亮界面框架最終展示效果如下圖所示。主界面中間區域的左邊是導航欄,右邊是顯示區域,點擊導航欄的導航節點后,在內容區域動態顯示其內容。此外,還提供了標題欄、狀態欄、系統菜單、系統設置等默認功能。

1 源碼下載

直接放出源碼地址,為了編譯源碼,需要下載安裝OSGi.NET插件框架安裝包:http://www.iopenworks.com/。

【1】框架安裝包:MuiTreeNavVsPackage.zip(使用方法見上一篇文章:分享一個漂亮WPF界面框架創作過程及其源碼)。

【2】框架源代碼:MuiTreeNavSource.zip

注意:運行后,默認賬戶為admin/admin。記得點擊右邊“推薦一下”,否則登錄會失敗!

2 OSGi.NET插件應用架構概述

基于OSGi.NET插件框架的應用由以下三個部分構成:

(1)主程序:針對特定應用環境(WPF、Web、WinForm等應用環境),加載啟動插件,獲取插件入口,運行入口程序。

(2)插件:提供應用功能,實現對其它插件功能擴展并暴露功能擴展點。

(3)插件框架:與特定應用環境無關,實現插件的加載、啟動、停止、更新和卸載,實現插件功能組合與擴展。

3 漂亮界面框架原理概述

WPF漂亮界面框架最終展示效果如下圖所示。主界面中間區域的左邊是導航欄,右邊是顯示區域,點擊導航欄的導航節點后,在內容區域動態顯示其內容。此外,還提供了標題欄、狀態欄、系統菜單、系統設置等默認功能。

該界面,從功能上看,它由界面框架插件、演示插件、權限管理插件、插件中心插件以及通用功能插件構成,如下所示。

這些插件的功能組合關系如下所示,"應用 = 界面框架插件 + 功能插件(演示/權限管理/插件中心插件)擴展"。界面框架定義了系統主界面風格、可擴展的屬性導航欄、可擴展的內容區域等元素構成。

上述的權限管理插件除了提供角色管理/用戶管理功能,它還定義了一個登錄窗體。主程序exe文件在執行時,首先創建并啟動OSGi.NET插件框架,然后通過服務總線獲取權限管理插件注冊的登錄窗體,并顯示。此時,程序執行的控制權則完全交由插件。

在權限管理插件的登錄界面,登錄成功之后,它會顯示界面框架插件定義的MainWindow主界面。該主界面則開始來組合插件的功能。下面,我們來看看插件實現的細節。

#p#

4 漂亮界面框架實現

4.1 主程序

主程序主要實現:(1)創建啟動插件框架;(2)獲取入口,并進入入口程序。下面我們來看看這個WPF主程序的入口。

在App.xaml.cs中定義了一個函數StartBundleRuntime,如下所示。

  1. private void StartBundleRuntime() 
  2.     …… 
  3.     // 創建BundleRuntime 
  4.     var bundleRuntime = new BundleRuntime(); 
  5.     // 不啟動多版本支持 
  6.     bundleRuntime.EnableAssemblyMultipleVersions = false
  7.     // 監聽插件狀態變化,更新進度條 
  8.     bundleRuntime.Framework.EventManager.AddBundleEventListener(BundleStateChangedHandler, true); 
  9.     // 監聽框架狀態變化 
  10.     bundleRuntime.Framework.EventManager.AddFrameworkEventListener(FrameworkStateChangedHandler); 
  11.     // 將Application實例添加到全局服務,與插件進行共享 
  12.     bundleRuntime.AddService<Application>(this); 
  13.     // 啟動插件框架 
  14.     bundleRuntime.Start(); 
  15.     // 移除事件監聽 
  16.     bundleRuntime.Framework.EventManager.RemoveBundleEventListener(BundleStateChangedHandler, true); 
  17.     bundleRuntime.Framework.EventManager.RemoveFrameworkEventListener(FrameworkStateChangedHandler); 
  18.   
  19.     Startup += App_Startup; 
  20.     Exit += App_Exit; 
  21.     _bundleRuntime = bundleRuntime; 

在主程序中,它使用以下代碼來獲取入口,這個入口是一個LoginWindow。 

  1. private void App_Startup(object sender, StartupEventArgs e) 
  2.     …… 
  3.     // 獲取loginWindow實例,并顯示該窗口 
  4.     var loginWindow = bundleRuntime.GetFirstOrDefaultService<Window>(); 
  5.     loginWindow.Loaded += (sender2, e2) => 
  6.     { 
  7.         loginWindow.Activate(); 
  8.     }; 
  9.     loginWindow.Show(); 

4.2 主程序與插件的通訊

OSGi.NET插件框架提供了一個簡單的方式來實現主程序與插件間的通訊,即服務。

主程序可以通過插件框架BundleRuntime來注冊和獲取服務,插件可以通過插件激活器的上下文來注冊和獲取服務、或者使用BundleRuntime.Instance這個單例來注冊與獲取服務。也就是說,主程序的BundleRuntime、插件的上下文IBundleContext都是對應相同的服務總線。

服務在這里表述為:服務 = 接口/基類 + 實現類。比如ISayHelloService接口、SayHelloServiceBase基類、SayHelloService實現類。我們可以注冊服務為:

  1. AddService<ISayHelloService>(new SayHelloService()) 

或者

  1. AddService<SayHelloServiceBase>(new SayHelloService()) 
 

那么獲取服務的方式就是:

  1. Get**Service<ISayHelloService>() 

或者 

  1. Get**Service<SayHelloServiceBase>() 

4.2.1主程序獲取插件注冊的服務

在該框架,主程序需要獲取權限管理插件注冊的登錄窗體,然后運行,接著將系統控制權轉交給插件。這時候,主程序通過以下代碼來獲取服務。

(1)創建啟動插件框架

  1. var bundleRuntime = new BundleRuntime(); 
  2.  
  3. bundleRuntime.Start(); 

(2)獲取服務

  1. var loginWindow = bundleRuntime.GetFirstOrDefaultService<Window>(); 
  2.  
  3. loginWindow.Show(); 

權限管理插件在Activator類中,通過以下代碼將LoginWindow注冊到服務總線。

  1. public class Activator : IBundleActivator 
  2.     public void Start(IBundleContext context) 
  3.     { 
  4.         context.AddService<Window>(new LoginWindow()); 
  5.     } 
  6.  
  7.     public void Stop(IBundleContext context) 
  8.     { 
  9.  
  10.     } 

這里,需要注意的是:主程序只能等插件框架啟動起來后,才能夠獲取插件注冊的服務。

4.2.2插件獲取主程序注冊的服務

主程序可以為插件注冊全局的服務,這樣所有插件在啟動的時候,就可以直接來訪問。主程序注冊全局服務的代碼如下:

  1. var bundleRuntime = new BundleRuntime(); 
  2.  
  3. bundleRuntime.AddService<ISayHelloService>(); 
  4.  
  5. bundleRuntime.Start(); 

注意:主程序在BundleRuntime.Start方法調用前注冊的服務,插件在啟動時即可獲取。

這時候,插件可以在激活器中直接獲取到該服務了。

  1. public class Activator : IBundleActivator 
  2.     public void Start(IBundleContext context) 
  3.     { 
  4.         var sayHelloService = context.GetFirstOrDefaultService<ISayHelloService>(); 
  5.         sayHelloService.Hell(“Lorry Chen”); 
  6.     } 
  7.  
  8.     public void Stop(IBundleContext context) 
  9.     { 
  10.  
  11.     } 

4.2.3 服務接口

在4.2.1小節中,主程序和權限管理插件在處理服務時,使用Window這個類作為服務的契約。這個服務契約是在.NET Framework中直接定義的,因此主程序和插件都可以訪問到。如果我們新定義的服務SayHelloService(ISayHelloService接口、SayHelloService服務實現類),那么這時候主程序和插件都需要通過接口ISayHelloService來獲取服務,這時候建議將ISayHelloService接口定義到一個外部的程序集,主程序可以引用它,插件也可以依賴它。

4.3 權限管理的登錄窗體

基于4.2,我們發現通過服務可以實現主程序和插件之間的通訊。當主程序獲取到權限管理注冊的登錄窗體實例,便獲取該窗體并展現它,此后應用系統便交由插件來控制了。

在權限管理插件的登錄窗體,它由LoginUserControl.xaml來實現,在該頁面的后臺代碼的登錄處理函數中,一旦登錄成功,它將創建一個主窗體MainWindow,并且顯示該窗體,如下圖所示。

在這里,權限管理插件創建了主窗體MainWindow類,這個類實際上是由界面框架插件定義的主窗體。因此,該插件依賴了界面框架插件,并添加了對UIShell.WpfShellPlugin程序集的引用。如下所示。

通過上述的工作,登錄窗體在登錄成功之后,就可以顯示界面框架的主窗體了。

4.4 界面框架插件

應用系統由界面框架插件、服務插件和功能插件構成,它們的組合關系如下所示。

從界面功能上來講,系統由主界面框架、插件中心插件、權限管理插件、演示插件組成,在其背后還有一些非界面功能插件,比如數據庫訪問等。

界面框架插件提供了一個可擴展、可組合的界面功能展示。界面框架插件暴露了一個名為UIShell.NavigationService的擴展點,權限管理插件、插件中心插件、其它插件則定義了針對該擴展點的擴展。

界面框架對應的擴展格式如下所示。該格式由名為Node的XML節點組成,Node節點可以嵌套包含子節點。

  1. <Extension Point="UIShell.NavigationService"
  2.   <Node Id="2E3614E0-388D-46E4-88A8-42E7CB3B421F" Name="權限管理" 
  3.         Icon="/UIShell.RbacManagementPlugin;component/Assets/Permission.png" 
  4.         Order="490"
  5.     <Node Name="角色管理" Permission="RoleManagementPermission" 
  6.           Value="UIShell.RbacManagementPlugin.RolePermissionUserControl" 
  7.           Icon="/UIShell.RbacManagementPlugin;component/Assets/Role.png" Order="1" /> 
  8.     <Node Name="用戶管理" Permission="UserManagementPermission" 
  9.           Value="UIShell.RbacManagementPlugin.UserPermissionUserControl" 
  10.           Icon="/UIShell.RbacManagementPlugin;component/Assets/User2.png" Order="2" /> 
  11.   </Node> 
  12. </Extension> 

當界面框架插件沒有加載任何擴展時,界面是空白的。左邊導航欄用于加載插件定義的導航菜單,右邊用于加載插件的顯示內容。

那么插件中心插件就是由對界面框架插件的擴展及如下功能構成,如下所示。

插件中心插件對界面框架插件的界面擴展是通過如下的Manifest.xml來定義的。

同理,權限管理插件也是對界面框架插件定義了擴展并實現了如下功能。

權限管理插件對界面框架的擴展定義在Manifest.xml中實現,如下所示。

課程管理這個示例插件也是如此。

4.4.1 導航服務

插件對界面框架的擴展的XML由導航服務來進行解析。通俗的講,該服務實現的是將以下XML節點變更NavigationNode對象。

  1. <Extension Point="UIShell.NavigationService"
  2.   <Node Id="2E3614E0-388D-46E4-88A8-42E7CB3B421F" Name="權限管理"  
  3.         Icon="/UIShell.RbacManagementPlugin;component/Assets/Permission.png"  
  4.         Order="490"
  5.     <Node Name="角色管理" Permission="RoleManagementPermission"  
  6.           Value="UIShell.RbacManagementPlugin.RolePermissionUserControl"  
  7.           Icon="/UIShell.RbacManagementPlugin;component/Assets/Role.png" Order="1" /> 
  8.     <Node Name="用戶管理" Permission="UserManagementPermission"  
  9.           Value="UIShell.RbacManagementPlugin.UserPermissionUserControl"  
  10.           Icon="/UIShell.RbacManagementPlugin;component/Assets/User2.png" Order="2" /> 
  11.   </Node> 
  12. </Extension> 

NavigationNode對象如下圖所示,它包含子對象。該對象對應于XML節點。我們可以通過INavigationService來獲取這些對象集合。INavigationService會默認從名字為"UIShell.NavigationService"的擴展點來創建對象。如果我們使用了類似的導航擴展定義,但使用了不同的擴展點,可以使用INavigationServiceFactory來創建指定擴展點的導航服務。

導航服務還隱藏了針對擴展變更事件的處理。該服務暴露了NavigationChanged事件來通知導航節點變更。

4.4.2 界面框架擴展實現

界面框架首先需要實現一個空的布局,其內容區域為樹和空白顯示區域。樹使用TreeView,空白顯示區域的父控件是DockPanel。那么,該框架實現的核心就是將NavigationNode的集合轉換成TreeViewNode集合,當點擊TreeViewNode時,能夠將其對應的用戶控件加載。

界面框架的XAML如下所示。

  1. <UserControl x:Class="UIShell.WpfShellPlugin.Pages.Layout"……> 
  2.     <Grid Style="{StaticResource ContentRoot}"
  3.         <DockPanel> 
  4.             <DockPanel DockPanel.Dock="Bottom" Height="20" ……> 
  5.                 ……//Status Bars 
  6.             </DockPanel> 
  7.  
  8.             <Grid> 
  9.                 <Grid.ColumnDefinitions> 
  10.                     <ColumnDefinition Name="TreeViewColumn"></ColumnDefinition> 
  11.                     <ColumnDefinition Width="*"></ColumnDefinition> 
  12.                 </Grid.ColumnDefinitions> 
  13.                  
  14.                 <TreeView Grid.Column="0" Grid.Row="0" Name="NavigationTreeView"  
  15.                     SelectedItemChanged="NavigationTreeView_SelectedItemChanged" /> 
  16.  
  17.                 <GridSplitter DragCompleted="GridSplitter_DragCompleted" /> 
  18.  
  19.                 <TextBlock  Grid.Column="1" Grid.Row="0" Name="LoadingTextBlock"  
  20.                     Text="加載中......"  …… Visibility="Hidden"></TextBlock> 
  21.  
  22.                 <Grid Grid.Column="1" Grid.Row="0" Name="LayoutDockPanel"
  23.                 </Grid> 
  24.             </Grid> 
  25.         </DockPanel> 
  26.          
  27.         <DockPanel Name="SideBarDockPanel"  
  28. Background="{DynamicResource WindowBackground}"  
  29. Width="300" HorizontalAlignment="Right" Visibility="Hidden"
  30.             <Border BorderThickness="2" BorderBrush="{DynamicResource Accent}"
  31.                 <Grid> 
  32.                     <Grid.RowDefinitions> 
  33.                         <RowDefinition Height="45" /> 
  34.                         <RowDefinition Height="*" /> 
  35.                     </Grid.RowDefinitions> 
  36.                      
  37.                     <TextBlock Name="SideBarTitleTextBlock"  
  38. Grid.Row="0" Margin="16, 16, 16, 0"  
  39. Foreground="{DynamicResource Accent}" FontSize="20" /> 
  40.                      
  41.                     <DockPanel Grid.Row="1" Margin="16"  
  42.                         Name="SideBarDockPanelContent"
  43.                     </DockPanel> 
  44.                 </Grid> 
  45.                  
  46.             </Border> 
  47.         </DockPanel> 
  48.     </Grid> 
  49. </UserControl> 

從這些XAML片段,你可以看到,LayoutDockPanel這個名字的控件時用于放置動態加載的插件的控件,加載時機是在NavigationTreeView的SelectedItemChanged事件。另外,該界面框架還實現了SideBarDockPanel,用于支持從側面動態滑出一個側邊框。

下面我們看看界面框架針對擴展的處理。

接著我們看看ResetNavigation函數的實現。

其實現的核心就是InitializeNavigationTreeView。

該函數就是根據NavigationNode集合,遞歸創建TreeViewItem。下面我們來看看點擊樹形導航節點時,如何動態加載顯示插件的控件,其核心代碼如下。

從插件動態加載類型時,我們使用的是node.Bundle.LoadClass,即獲取擴展注冊的插件對象,調用該對象的LoadClass方法來加載用戶控件,然后將用戶控件顯示在LayoutDockPanel控件。

不過,當前界面框架還處理一些其它的功能:

(1)當前導航節點的側邊欄,即當切換菜單時,會自動打開/關閉與其關聯的側邊欄;

(2)緩存與關閉,即加載用戶控件后,會直接緩存,在切換時,會將前一個控件隱藏,接著顯示當前控件;只有關閉后,用戶控件才從父控件移除掉;

(3)關閉內容區域與導航節點選擇的同步,也就是說,關閉當前內容后,會默認顯示前一個頁面,此時,導航節點的選擇也必須同步切換;

(4)相關對象的關系存儲。

4.5 插件

下面我將從以下幾個方面來談一下開發插件過程中,需要處理的一些問題。

4.5.1 插件引用了第三方程序集

在主界面框架中,我們依靠第三方控件庫"ModernUI"來實現界面,并對"ModernUI"做深入的定制。在界面框架插件引用該控件時,首先,我們需要將該插件添加到Manifest.xml作為本地程序集,即界面框架插件在運行時需要與該程序集一起才能夠正常運行。

接著,可以直接從bin目錄來引用該程序集或者添加ModernUI源碼項目的程序集引用。

這時候,在界面框架插件中,就可以來直接使用ModernUI程序集的類型了。如下示例。

  1. ModernDialog.ShowMessage("Hello, world!", "Hello", MessageButtongs.Ok); 

或者

  1. var dialog = new ModernDialog(){……}; 
  2.  
  3. dialog.ShowDialog(); 

4.5.2 一個程序集如何讓所有插件都直接使用

在這個WPF應用程序,每一個插件在開發界面時大部分使用了MVVM架構,它依賴于MVVMLite這個庫。為了能夠讓插件直接使用,并且不需要將其添加到本地程序集的情況下來使用。我們可以在主程序里面直接添加對MVVMLite程序集的依賴,編譯后,每一個插件可以直接來引用主程序輸出目錄下的MVVMLite程序集。

你可以發現,MVVMLite程序集所在的位置。如果是Web應用的話,這些程序集所在目錄是bin目錄。這樣的程序集在OSGi.NET框架中成為全局程序集,默認開啟支持該功能。你可以通過設置BundleRuntime.EnableGlobalAssemblyFeature屬性開啟或者關閉該功能。

全局程序集有以下特點:(1)如果插件包含了另一個程序集,和該程序集名稱一樣,則會被替換掉;(2)全局程序集不支持多版本。

4.5.3 插件引用了另一個插件的程序集

在該界面框架中,所有UI插件都是基于ModernUI控件庫來實現。該控件庫在界面框架中包含。因此,我們的功能插件需要引用界面框架插件的ModernUI控件庫。

首先,在界面框架,需要將該程序集定義成共享。

接著,在功能插件中,需要添加對界面框架的依賴。

最后,插件就可以直接通過引用,來添加對該程序集的引用,并在代碼中來調用了。

4.5.4 插件間的通訊實現

插件間的通訊,有兩種方式,第一種是一個插件直接使用另一個插件的程序集的類,如4.5.3的方式;第二種是松耦合的方式,即使用服務。

比如,在演示插件,我們引用了配置服務。配置服務是在配置服務插件來創建的,該服務定義如下所示。

該插件通過Activator來注冊服務實例,如下所示。

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4. using UIShell.OSGi; 
  5.  
  6. namespace UIShell.ConfigurationService 
  7.     public class Activator : IBundleActivator 
  8.     { 
  9.         public void Start(IBundleContext context) 
  10.         { 
  11.             context.AddService<IConfigurationService>(new ConfigurationService()); 
  12.         } 
  13.  
  14.         public void Stop(IBundleContext context) 
  15.         { 
  16.              
  17.         } 
  18.     } 

演示插件依賴于IConfigurationService接口所在的程序集,通過該接口來獲取服務,如下所示。

接著,在演示插件就可以通過以下方式來存儲或者獲取配置了。

  1. BundleActivator.ConfigrationService.Set(BundleActivator.Bundle, "TreeViewColumnWidth", 80); 

或者

  1. var width = BundleActivator.ConfigurationService.Get(BundleActivator.Bundle, "TreeViewColumnWidth", 80); 

4.5.5 如何從插件動態的加載類型

從插件加載類型的方式通過插件對象來實現。插件對象由OSGi.NET框架創建,可以通過插件激活器的IBundleContext.Bundle屬性獲取。

  1. var bundle = Context.Bundle; // 或者var bundle = Context.GetBundleBySymbolicName("DemoPlugin"); 
  2. var class = bundle.LoadClass("DemoPlugin.CourseManagementUserControl"); 

5 關于框架的藝術

框架的藝術并不在于技術本身,而是在于能夠幫助團隊更有效率的進行產品開發。為了提高產品開發效率,框架必須能夠提供:

(1)統一的開發模板:通過模板來規范團隊成員的編碼規則與規范功能模塊的架構,減少軟件開發的學習成本。比如,我們制作的演示插件模板,在這個模板基礎上做功能開發,是不需要你掌握多少關于框架本身的技術,而是專注于業務實現及通用功能的調用;此外,該模板規范了MVVM架構分層,統一了架構思想。

(2)一致的用戶體驗:通過框架為客戶定義了一致的界面風格,這使我們的軟件看上起更加的專業。

(3)良好的分工協作:通過框架,團隊成員可以專注于不同的功能模塊,進行有效率的并行協作。

6 總結

這個教程介紹了漂亮界面框架的架構、實現細節,通過這個教程,你已經能夠掌握使用OSGi.NET框架來開發一個漂亮界面框架了。

原文鏈接:http://www.cnblogs.com/baihmpgy/p/osgi_muinavtree_fx.html

責任編輯:張偉 來源: 博客園
相關推薦

2009-12-23 10:46:38

WPF實現用戶界面

2021-08-09 11:15:28

MybatisJavaSpring

2021-08-06 08:33:27

Springboot分布式Seata

2009-09-22 17:13:53

Hibernate O

2019-10-16 16:33:41

Docker架構語言

2021-04-28 06:26:11

Spring Secu功能實現源碼分析

2019-09-20 08:54:38

KafkaBroker消息

2009-12-29 11:01:46

WPF淡入效果

2024-01-18 08:31:22

go實現gorm框架

2022-07-19 20:04:31

NAPI模塊鴻蒙

2018-10-31 15:54:47

Java線程池源碼

2009-12-25 10:11:46

WPF后臺控制動畫

2012-04-11 15:41:48

JavaNIO

2009-07-24 13:54:39

MVVM模式

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2023-11-09 09:08:38

RibbonSpring

2020-07-08 14:50:18

WebpackHMR前端

2012-02-23 12:53:40

JavaPlay Framew

2021-07-03 15:22:02

Mybatis InsID源碼

2023-11-06 18:37:23

虛擬線程編寫
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品二十页| 欧美一区二区性| 亚洲在线一区二区三区| 99精品国产一区二区| 九九视频在线免费观看| 凹凸av导航大全精品| 大桥未久av一区二区三区| 日本不卡二区高清三区| 一级做a爱片久久毛片| 中文字幕亚洲综合久久五月天色无吗'' | 日本欧美www| 欧美大片免费播放器| 午夜精品一二三区| 国产日本精品| 在线观看欧美日韩| 天堂av在线网站| 婷婷五月在线视频| 波多野结衣在线aⅴ中文字幕不卡| 久久全国免费视频| 加勒比综合在线| 成人在线视频www| 精品欧美aⅴ在线网站| 视频一区二区综合| 乱色精品无码一区二区国产盗| 亚洲一级在线| 欧美另类老女人| 欧美多人猛交狂配| 日韩一区免费| 欧美亚洲动漫制服丝袜| 九一免费在线观看| 国产视频福利在线| 成人性生交大合| 国产日韩欧美一二三区| 国产精品午夜影院| 久久久久久久久久久9不雅视频| 亚洲电影在线看| 999这里有精品| 中文在线а√在线8| 亚洲免费观看在线观看| 日韩欧美一区二区三区久久婷婷| 老司机午夜福利视频| 麻豆成人91精品二区三区| 97视频在线观看免费高清完整版在线观看| 日韩网站在线播放| 亚洲精品在线a| 欧美日免费三级在线| 男人天堂999| 国产第一页在线视频| 国产精品久久久99| 久久综合九色欧美狠狠| 亚洲黄色在线免费观看| 精品在线一区二区| 国产精品第8页| 亚洲 欧美 视频| 精品动漫3d一区二区三区免费版 | 亚洲欧美一区二区视频| 秋霞在线观看一区二区三区| 99在线观看免费| 激情久久五月天| 国产精品久久久久av| 青青青国产在线 | 久久久亚洲精品石原莉奈| 俄罗斯精品一区二区| 国产99对白在线播放| 精品亚洲国内自在自线福利| 国产精品美女www爽爽爽视频| 四虎成人在线观看| 久久都是精品| 欧洲美女7788成人免费视频| 免费日韩一级片| 国产亚洲精品bv在线观看| 久久久久久久久久婷婷| 国产精选第一页| 中文一区在线| 欧美一级黑人aaaaaaa做受| 日韩 欧美 综合| 亚洲欧美清纯在线制服| 国产91av在线| www.色国产| 免费亚洲电影在线| 国产欧美日韩亚洲精品| 国产色在线视频| 国产盗摄女厕一区二区三区| 国产精品播放| 视频在线不卡| 日本一区二区成人在线| 日本一区二区三区四区高清视频| 黄色av网址在线免费观看| 欧美国产成人精品| 亚洲区成人777777精品| 欧美人与性动交α欧美精品图片| 夜夜嗨av一区二区三区网页| 欧美深夜福利视频| 欧美日韩电影免费看| 欧美日韩一区小说| 五月天国产视频| 高潮久久久久久久久久久久久久| 亚洲国产精品小视频| 亚洲av成人无码久久精品 | 韩国成人在线视频| 国产精品一区二区免费| 欧美婷婷久久五月精品三区| 中文av字幕一区| dy888午夜| 在线不卡日本v二区707| 红桃av永久久久| 国产一级不卡毛片| 久久天堂久久| 亚洲精品有码在线| 在线免费观看麻豆| 久久精品影视| 欧美诱惑福利视频| 91尤物国产福利在线观看| 懂色中文一区二区在线播放| 欧美日韩精品综合| 婷婷在线播放| 在线欧美日韩精品| 爱豆国产剧免费观看大全剧苏畅| 国产一区福利| 中文字幕亚洲欧美日韩高清| 久久精品这里有| 日本不卡一区二区三区高清视频| 国产免费一区| 国产精品刘玥久久一区| 午夜免费久久看| 最新天堂在线视频| 香蕉视频一区| 欧美人交a欧美精品| 亚洲大片免费观看| 成人午夜电影久久影院| 亚洲精品日韩精品| 日韩三级电影视频| 欧美日韩国产另类一区| 麻豆国产精品一区| 欧美黄色大片网站| 国产精品偷伦一区二区| 亚洲 另类 春色 国产| 亚洲男人的天堂在线观看| 日韩在线第三页| 欧洲亚洲一区二区三区| 欧美高跟鞋交xxxxxhd| 一区精品在线观看| 国产亚洲成aⅴ人片在线观看| 国产制服91一区二区三区制服| 手机在线理论片| 精品国产91久久久久久久妲己 | 鲁丝一区二区三区| 国产综合婷婷| 成人国产在线激情| av网站无病毒在线| 婷婷综合在线观看| 成人一区二区三区仙踪林| 国产精品久久久久久久| 国产精品精品视频一区二区三区| 天堂√在线中文官网在线| 亚洲综合色区另类av| 最新免费av网址| 久久高清精品| 国产精品永久免费视频| av每日在线更新| 欧美综合天天夜夜久久| 无码人妻精品一区二区中文| 美女国产精品| 欧美日韩亚洲一区二区三区在线观看 | 激情小说网站亚洲综合网| 中文字幕中文字幕在线中高清免费版 | 亚洲va久久久噜噜噜久久天堂| www亚洲人| 欧美手机在线视频| 永久免费观看片现看| 欧美aaa在线| 亚洲成人自拍视频| 欧美三级电影网址| 久久精品国产亚洲一区二区| 亚洲中文一区二区三区| 一区精品在线播放| 中文字幕在线视频一区二区三区 | 亚洲一区二区三区免费观看| 国产成人77亚洲精品www| 最新国产成人av网站网址麻豆| 中文天堂在线视频| 久久久激情视频| 国产精品人人爽人人爽| 欧美激情成人| 亚洲一区二区三区激情| 日本国产欧美一区二区三区| 久久久久国产精品嫩草影院| 在线亚洲一区二区| 熟女少妇a性色生活片毛片| 黑人巨大精品欧美一区| 少妇久久久久久被弄到高潮| 红杏视频成人| 国产精品成av人在线视午夜片| seseavlu视频在线| 欧美一区二区在线免费播放| 国产在线拍揄自揄拍无码视频| 国产乱对白刺激视频不卡| 欧美成人免费在线观看视频| 狠狠做六月爱婷婷综合aⅴ| 国产日韩在线看片| av岛国在线| 亚洲天堂色网站| 国产草草影院ccyycom| 亚洲成av人片一区二区梦乃| 国内精品卡一卡二卡三| 国产成人在线电影| 男人透女人免费视频| 久久精品久久久| 鲁丝片一区二区三区| 成人国产精品一区二区网站| 国外成人免费在线播放 | 免费人成在线观看播放视频| 日韩免费高清av| 日本中文字幕在线观看视频| 亚洲人精品午夜| 国产精品1000部啪视频| 国产一区二区调教| 亚洲精品乱码久久久久久自慰| 一区二区蜜桃| 欧美激情一区二区三区在线视频| 亚洲香蕉久久| 亚洲一区二区四区蜜桃| 成人黄色大片在线免费观看| 色yeye免费人成网站在线观看| 亚洲午夜精品久久久久久性色| 国产aⅴ一区二区三区| 91电影在线观看| 欧美黑人一级片| 国产精品乱码妇女bbbb| 国产一级二级在线观看| 国产精品一区二区久激情瑜伽| 亚洲人成无码www久久久| 精品成人在线| 精品一区二区成人免费视频 | 国产伦精品一区二区三区88av| 麻豆91在线观看| 福利视频一二区| 在线中文字幕亚洲| 一区高清视频| 国产亚洲一区二区三区啪| 国产一区二区精品在线| 日本精品视频| 成人字幕网zmw| 在线免费日韩片| 久久免费视频网| 羞羞视频在线免费国产| 日韩视频免费在线观看| 黄色av免费在线观看| 日韩电影网在线| 日本免费一区视频| 精品久久久久一区| 精品国产av 无码一区二区三区| 欧美日韩在线综合| av手机天堂网| 欧美最新大片在线看| 天码人妻一区二区三区在线看| 亚洲成人av福利| 国产精品第108页| 亚洲成人激情自拍| 激情综合网五月婷婷| 亚洲精品写真福利| 亚洲欧美精品aaaaaa片| 国产精品久线在线观看| 大吊一区二区三区| 亚洲精选久久| 日韩精品中文字幕视频在线| 精品女同一区二区三区| 日韩精品资源二区在线| 97精品人妻一区二区三区| 欧美男男青年gay1069videost| 一区二区三区黄| 在线播放中文一区| 国产免费一区二区三区最新不卡 | 日韩欧美大片在线观看| 亚洲五码中文字幕| 在线观看精品国产| 色哟哟一区二区| 亚洲成人av网址| 欧美日韩dvd在线观看| 中文字幕+乱码+中文| 91精品国产高清一区二区三区蜜臀| 性网爆门事件集合av| 日韩精品久久久久| 在线a人片免费观看视频| 欧美精品在线播放| 亚洲欧洲高清| 国产视频福利一区| 麻豆成人入口| 亚洲一二三区精品| 亚洲激情五月| 黄色片视频在线播放| 激情六月婷婷久久| 9.1成人看片免费版| 亚洲男女毛片无遮挡| 天天做天天爱夜夜爽| 91精品婷婷国产综合久久性色| 手机看片1024日韩| 久久综合免费视频| 日韩电影av| 99久热re在线精品视频| 欧美日韩激情在线一区二区三区| 亚洲国产一二三精品无码 | 欧美最猛性xxxx| 久久久久久久久成人| 日韩三级电影网站| 亚洲欧洲综合| 久久久久亚洲av无码麻豆| 国产人久久人人人人爽| 日本少妇bbwbbw精品| 欧美年轻男男videosbes| 日韩精品视频无播放器在线看 | 久久综合加勒比| 欧美日韩午夜在线| 四虎影视精品成人| 欧美肥老妇视频| 中文字幕成人| 色姑娘综合网| 老司机精品导航| 性欧美丰满熟妇xxxx性久久久| 亚洲精品国产精华液| 又色又爽又黄无遮挡的免费视频| 亚洲精品一区二三区不卡| 国产白浆在线免费观看| 亚洲一区二区三区视频播放| 日韩一区电影| 亚洲乱码国产一区三区| 久久综合久久综合久久综合| 国产精品二区一区二区aⅴ| 日韩免费看网站| 深夜国产在线播放| 91中文字幕在线| 国产精品久久久久久影院8一贰佰| 北条麻妃av高潮尖叫在线观看| 99国产精品久久久| 国产无遮挡免费视频| 欧美成人官网二区| 丝袜在线视频| 国产99视频精品免费视频36| 欧美在线高清| 亚洲欧洲国产视频| 一区二区成人在线| 成人毛片在线精品国产| 欧美激情视频免费观看| 成人爽a毛片| 蜜臀av色欲a片无码精品一区| 成人晚上爱看视频| 国产精品第一页在线观看| 亚洲成人网av| 日韩伦理福利| 蜜桃麻豆91| 三级不卡在线观看| 五月天婷婷丁香网| 7777精品伊人久久久大香线蕉完整版 | 久久天堂久久| 欧美 亚洲 视频| 成人av影院在线| 日韩欧美一区二区一幕| 日韩电影大片中文字幕| 欧美va在线| 中文字幕欧美日韩一区二区| 国产一区二区三区蝌蚪| 久久久久久久久久99| 亚洲高清在线观看| 欧美大片免费| 亚洲午夜精品一区二区| 国产精品香蕉一区二区三区| 日韩激情在线播放| 亚洲人成电影网| 国产精品久久久久久吹潮| 日韩不卡一二区| 成人午夜私人影院| 无码人妻精品一区二区50| 日韩在线观看免费高清完整版| 国产一区二区在线观| 国产毛片视频网站| 久久久久久久久久久久久夜| 一级片免费观看视频| 久久久久久中文字幕| 久久99蜜桃| www.桃色.com| 日韩欧美亚洲成人| 麻豆传媒在线观看| 九色综合婷婷综合| 久久精品99国产精品| 国产午夜激情视频| 在线精品高清中文字幕| 99精品国产一区二区三区2021| 国内外成人免费激情视频| 一色桃子久久精品亚洲| 污污的视频网站在线观看| 国产精品黄视频| 国产精品xvideos88| 国产精品成人在线视频| 精品美女在线播放| 福利视频亚洲| 国产午夜大地久久| 亚洲视频免费看| 欧美老女人性开放| 99porn视频在线| 琪琪一区二区三区|