[UWP] 使用SemanticZoom控制項

来源:http://www.cnblogs.com/arcsinw/archive/2016/02/15/5189789.html
-Advertisement-
Play Games

在寫一個看新聞軟體的時候,用到了SemanticZoom控制項,遇到了一些問題,比如如何根據首字母分類,以及放大視圖中有數據的和沒數據的通過背景色或前景色區分,幸運的是,all solved。 先來個效果圖 主要是參考了msdn的一篇博客,地址已經放在參考鏈接里了。 首先是一個SemanticZoom


在寫一個看新聞軟體的時候,用到了SemanticZoom控制項,遇到了一些問題,比如如何根據首字母分類,以及放大視圖中有數據的和沒數據的通過背景色或前景色區分,幸運的是,all solved。

先來個效果圖

 主要是參考了msdn的一篇博客,地址已經放在參考鏈接里了。

首先是一個SemanticZoom控制項,這個控制項有ZoomedInView和ZoomedOutView兩種視圖。

ZoomedOutView視圖就是這個

 而ZoomedInView視圖就是一個帶有列表頭的列表的樣子,還是上個圖好了,我個人不喜歡看一大段的純文字

 

首先弄個Model,這裡叫Picture

1  public class Picture
2     {
3         public string ImageUri { get; set; }
4         public string Title { get; set; }
5     }

然後再加個ViewModel,叫MainPageViewModel,類里寫一個數據集合和載入數據的方法

1  public ObservableCollection<AlphaKeyGroup<Picture>> AllPictures { get; set; }

關於載入數據的方法,很顯然,我們要把數據按照Title的首字母分組,按首字母分組說實話我不會,然後我在msdn找到了一個類叫AlphaKeyGroup,這個類可以用來按首字母分組

 1 public class AlphaKeyGroup<T> : List<T>
 2     {
 3         /// <summary>
 4         /// The delegate that is used to get the key information.
 5         /// </summary>
 6         /// <param name="item">An object of type T</param>
 7         /// <returns>The key value to use for this object</returns>
 8         public delegate string GetKeyDelegate(T item);
 9 
10         /// <summary>
11         /// The Key of this group.
12         /// </summary>
13         public string Key { get; private set; }
14 
15         /// <summary>
16         /// Public constructor.
17         /// </summary>
18         /// <param name="key">The key for this group.</param>
19         public AlphaKeyGroup(string key)
20         {
21             Key = key;
22         }
23 
24         /// <summary>
25         /// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping.
26         /// </summary>
27         /// <param name="slg">The </param>
28         /// <returns>Theitems source for a LongListSelector</returns>
29         private static List<AlphaKeyGroup<T>> CreateGroups(SortedLocaleGrouping slg)
30         {
31             List<AlphaKeyGroup<T>> list = new List<AlphaKeyGroup<T>>();
32 
33             foreach (string key in slg.GroupDisplayNames)
34             {
35                 list.Add(new AlphaKeyGroup<T>(key));
36             }
37 
38             return list;
39         }
40 
41         /// <summary>
42         /// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping.
43         /// </summary>
44         /// <param name="items">The items to place in the groups.</param>
45         /// <param name="ci">The CultureInfo to group and sort by.</param>
46         /// <param name="getKey">A delegate to get the key from an item.</param>
47         /// <param name="sort">Will sort the data if true.</param>
48         /// <returns>An items source for a LongListSelector</returns>
49         public static List<AlphaKeyGroup<T>> CreateGroups(IEnumerable<T> items, CultureInfo ci, GetKeyDelegate getKey, bool sort)
50         {
51             SortedLocaleGrouping slg = new SortedLocaleGrouping(ci);
52             List<AlphaKeyGroup<T>> list = CreateGroups(slg);
53 
54             foreach (T item in items)
55             {
56                 int index = 0;
57                 if (slg.SupportsPhonetics)
58                 {
59                     //check if your database has yomi string for item
60                     //if it does not, then do you want to generate Yomi or ask the user for this item.
61                     //index = slg.GetGroupIndex(getKey(Yomiof(item)));
62                 }
63                 else
64                 {
65                     index = slg.GetGroupIndex(getKey(item));
66                 }
67                 if (index >= 0 && index < list.Count)
68                 {
69                     list[index].Add(item);
70                 }
71             }
72 
73             if (sort)
74             {
75                 foreach (AlphaKeyGroup<T> group in list)
76                 {
77                     group.Sort((c0, c1) => { return ci.CompareInfo.Compare(getKey(c0), getKey(c1)); });
78                 }
79             }
80 
81             return list;
82         }
83 
84     }
AlphaKeyGroup

使用的時候這樣

1  //按拼音分組
2  List<AlphaKeyGroup<Picture>> groupData = AlphaKeyGroup<Picture>.CreateGroups(
3                 picturesList, (Picture s) => s.Title, true);
4 
5  foreach (var item in groupData)
6  {
7      AllPictures.Add(item);
8  }

當然首先要在picturesList裡加一些示例數據

1  picturesList.Add(new Picture { ImageUri = "http://t3.gstatic.com/images?q=tbn:ANd9GcQ_ih-aN2gxUz435mPC733IFDNhk1vqFQSVKshWMHEtzxKfKqbs", Title = "OOO" });
2             picturesList.Add(new Picture { ImageUri = "http://4.bp.blogspot.com/-v4cAAv3ViZk/T3w0jsZocUI/AAAAAAAACE0/l21tSjKnSUI/s640/Cool_facebook_timeline_covers+%252814%2529.jpg", Title = "ZZZ" });
3             picturesList.Add(new Picture { ImageUri = "http://t3.gstatic.com/images?q=tbn:ANd9GcTv1Kx5oic3I39RTIoAMrFOKQxaIKNtXSNSr5B5bUGsX5mRMMBl_Q", Title = "DDD" });
4             picturesList.Add(new Picture { ImageUri = "http://t0.gstatic.com/images?q=tbn:ANd9GcRFzgy_qOhDZ3GAQVxIOi1oTg8VSToo8hX_0cxoD6ZqUW9K-r9p", Title = "BBB" });
View Code

然後開始寫UI部分,當然要先把Page的DataContext設置到MainPageViewModel的實例,比較簡單這裡就不寫了, 再在Xaml裡加上一個CollectionViewSource,用來給SemanticZoom提供數據,ItemsPath填的是集合屬性的名字,至於為什麼填這個,看看AlphaKeyGroup類的源碼就知道了,IsSourceGrouped意思是要把AllPictures分組

1 <CollectionViewSource x:Key="CollectionViewSource" IsSourceGrouped="True" 
2                                           ItemsPath="InternalList"
3                                           Source="{Binding AllPictures}"/>

開始寫SemanticZoom

 1 <SemanticZoom >
 2             <SemanticZoom.Style>
 3                 <Style TargetType="SemanticZoom">
 4                     <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
 5                 </Style>
 6             </SemanticZoom.Style>
 7             <!--數據列表-->
 8             <SemanticZoom.ZoomedInView>
 9                 <ListView ItemsSource="{Binding Source={StaticResource CollectionViewSource}}"
10                                   SelectionMode="None" 
11                                   ShowsScrollingPlaceholders="True"
12                                   IsItemClickEnabled="True"
13                                   ItemClick="ListView_ItemClick">
14                     <ListView.ItemTemplate>
15                         <DataTemplate>
16                             <Grid  Padding="0,8"
17                                    BorderThickness="{StaticResource BorderThickness}" 
18                                    BorderBrush="{StaticResource BorderBrush}" >
19                                 <Grid.ColumnDefinitions>
20                                     <ColumnDefinition Width="2*"/>
21                                     <ColumnDefinition Width="3*"/>
22                                     <ColumnDefinition Width="Auto"/>
23                                 </Grid.ColumnDefinitions>
24                                 <Image Grid.Column="0" Stretch="Fill" HorizontalAlignment="Left" >
25                                     <Image.Source>
26                                         <BitmapImage UriSource="{Binding imageUri}"/>
27                                     </Image.Source>
28                                 </Image>
29                                 <Grid Grid.Column="1" Margin="5,2">
30                                     <TextBlock Text="{Binding Title}" VerticalAlignment="Top" TextWrapping="Wrap"/>
31                                 </Grid>
32                             </Grid>
33                         </DataTemplate>
34                     </ListView.ItemTemplate>
35                     <ListView.ItemContainerStyle>
36                         <Style TargetType="ListViewItem">
37                             <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
38                             <Setter Property="Margin" Value="0"/>
39                         </Style>
40                     </ListView.ItemContainerStyle>
41                     <!--列表頭-->
42                     <ListView.GroupStyle>
43                         <GroupStyle HidesIfEmpty="True" >
44                             <GroupStyle.HeaderTemplate>
45                                 <DataTemplate>
46                                     <TextBlock Text="{Binding Key}" FontSize="25" Foreground="Red"/>
47                                 </DataTemplate>
48                             </GroupStyle.HeaderTemplate>
49                         </GroupStyle>
50                     </ListView.GroupStyle>
51                 </ListView>
52             </SemanticZoom.ZoomedInView>
53             <!--排序列表-->
54             <SemanticZoom.ZoomedOutView>
55                 <GridView ItemsSource="{Binding Source={StaticResource CollectionViewSource},Path=CollectionGroups}">
56                     <GridView.ItemsPanel>
57                         <ItemsPanelTemplate>
58                             <WrapGrid MaximumRowsOrColumns="4" VerticalAlignment="Top" Orientation="Horizontal"/>
59                         </ItemsPanelTemplate>
60                     </GridView.ItemsPanel>
61                     <GridView.ItemTemplate>
62                         <DataTemplate>
63                             <Border Background="{Binding Converter={StaticResource BackgroundConverter}}">
64                                 <TextBlock Text="{Binding Group.Key}" HorizontalAlignment="Center" 
65                                                    VerticalAlignment="Center"
66                                                    Foreground="{Binding Converter={StaticResource ForegroundConverter}}"/>
67                             </Border>
68                         </DataTemplate>
69                     </GridView.ItemTemplate>
70 
71                     <GridView.ItemContainerStyle>
72                         <Style TargetType="GridViewItem">
73                             <Setter Property="HorizontalAlignment" Value="Center"/>
74                             <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
75                             <Setter Property="VerticalAlignment" Value="Center"/>
76                             <Setter Property="VerticalContentAlignment" Value="Stretch"/>
77                         </Style>
78                     </GridView.ItemContainerStyle>
79                     <GridView.Template>
80                         <ControlTemplate>
81                             <ScrollViewer ScrollViewer.VerticalScrollMode="Enabled">
82                                 <Viewbox Stretch="Uniform" Margin="8"  VerticalAlignment="Top" 
83                                              ScrollViewer.VerticalScrollMode="Enabled" StretchDirection="Both" >
84                                     <ItemsPresenter  />
85                                 </Viewbox>
86                             </ScrollViewer>
87                         </ControlTemplate>
88                     </GridView.Template>
89                 </GridView>
90             </SemanticZoom.ZoomedOutView>
91         </SemanticZoom>
SemanticZoom

註意到排序列表的GridView.ItemTemplate ,用到了兩個Converter,即BackgroundConverterForegroundConverter

1      <Border Background="{Binding Converter={StaticResource BackgroundConverter}}">
2             <TextBlock Text="{Binding Group.Key}" HorizontalAlignment="Center" 
3                        VerticalAlignment="Center"
4                        Foreground="{Binding Converter={StaticResource ForegroundConverter}}"/>
5      </Border>

我一直想實現在ZoomedOutView里那種有數據的和沒數據的用顏色區分的功能,自己寫Converter沒寫出來,然後發現了這個

這兩個Converter是系統自帶的,用的時候設置好Enabled和Disabled的顏色,有數據的時候顯示Enabled的顏色,沒有就顯示Disabled的顏色

1 <JumpListItemBackgroundConverter x:Key="BackgroundConverter" Enabled="Red"
2                                          Disabled="Transparent"/>
3 <JumpListItemBackgroundConverter x:Key="ForegroundConverter" Enabled="White" Disabled="Black"/>

 其他沒什麼了,附上demo

SemanticZoomDemo

 

參考鏈接

http://blogs.msdn.com/b/msgulfcommunity/archive/2013/06/18/implementing-longlistselector-as-jumplists-in-windows-phone-8-alphabetical-list.aspx


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML最難的地方來了!這個我反覆了很多遍, 包括現在寫博客, 也對我自己算是一種溫習, 我這塊怕是沒辦法寫的很好懂, 因為我自己還不能把我學到的準確通俗易懂的表達出來, 給自己記個筆記, 以後再來一點一點的改, 新手可以看看, 對於初學這塊的人應該還是有點幫助的. CSS佈局模型 以下全部是個人初
  • 1 <script type="text/javascript" src="//libs.baidu.com/jquery/1.7.2/jquery.min.js"></script> 2 <!--如果cdn jQ載入不成功 載入本地jQ庫 --> 3 <script type="text/java
  • 在做自己的nodejs項目的時候遇到需要使用ueditor。原來下載的是ueditor的jsp版本。目錄如下 在ueditor.config.js中有配置伺服器home路徑(這個home路徑能找到ueditor文件夾,可以使用這個路徑訪問ueditor內的靜態資源,比如我的top.ctx為http:
  • 原文地址:http://www.cnblogs.com/galenyip/p/4613430.html 我們先來看一下js的非同步提交。 XHR我們在原生的時候常常用到,因為常用到,我們更多把封裝到了工具庫中 先看下他最常用的實現 1 // 舊方法 2 3 function createXHR() {
  • 作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5191617.html 1.寫在前面 大部分andriod應用需要與伺服器進行數據交互,HTTP、FTP、SMTP或者是直接基於SOCKET編程都可以進行數據交互,但
  • 前言: QQ表情包就用到瞭解壓縮,從網路下載的那麼多表情文件格式並不是一個一個圖片文件,而是多個圖片壓縮而成的表情壓縮包。下麵介紹的是iOS開發中會用到的壓縮和解壓縮的第三方框架的使用。 註意: 這個第三方框架代碼文件夾是SSZipArchive,使用cocoapods搜索也是搜索SSZipArch
  • POPSpringAnimation也許是大多數人使用POP的理由 其提供一個類似彈簧一般的動畫效果;實例源代碼已經上傳至gitHub,地址:https://github.com/wujunyang/facebookPopTest POPSpringAnimation可配置的屬性與預設值為 spri
  • 前言:本篇講解,在前篇iOS開發之網路編程--使用NSURLConnection實現大文件斷點續傳下載的基礎上,使用輸出流代替文件句柄實現大文件斷點續傳。 在實際開發中,輸入輸出流用的比較少,但是用起來也是很方便的。iOS開發用到的輸入輸出流和在Java中的輸入輸出流是幾乎一樣的,本質也是一個意思:
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...