您好,登錄后才能下訂單哦!
與LibraryStack 類似LibraryBar 也屬于ItemsControl,在LibraryBar 里的組件會以水平平鋪方式展示,并且也可以對其中的組件進行按組分類。同樣LibraryBar 也是默認支持拖拽操作。
下面的例子將通過LibraryBar 展示一組Sample 圖片。首先,仍然可以使用DataTemplate 作為LibraryBar 的樣式模板用來綁定圖片資源。接下來在Grid 中添加LibraryBar 控件,并設置好ItemTemplate 數據模板。我們可以通過修改Rows 參數調整LibraryBar 中組件顯示的行數。
<s:SurfaceWindow x:Class="Demo.SurfaceWindow1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="http://schemas.microsoft.com/surface/2008" Title="LibraryBar" > <s:SurfaceWindow.Resources> <DataTemplate x:Key="LibraryBarItemTemplate"> <Image Source="{Binding}"/> </DataTemplate> </s:SurfaceWindow.Resources> <Grid> <s:LibraryBar x:Name="mLibraryBar" Rows="3"
ItemTemplate="{StaticResource LibraryBarItemTemplate}"/> </Grid> </s:SurfaceWindow>
為LiraryBar 添加圖片數據源。注意,同樣不能將圖片string[] 數組直接賦給LiraryBar,需要借助ObservableCollection。
string imagesPath = @"C:\Users\Public\Pictures\Sample Pictures\"; try { string[] files = System.IO.Directory.GetFiles(imagesPath, "*.jpg"); ObservableCollection<string> items = new ObservableCollection<string>(files); mLibraryBar.ItemsSource = items; } catch (System.IO.DirectoryNotFoundException) { // Error info. }
默認兩行模式:
三行模式:
接下來我們將圖片進行分組操作,先增加一個PhotoAlbum 類,其中包含圖片的路徑、標簽、組名信息。
class PhotoAlbum { private string label; private string fileName; private string groupName; private BitmapImage bitmap; public PhotoAlbum(string fileName, string label, string groupName) { this.fileName = fileName; this.label = label; this.groupName = groupName; this.bitmap = new BitmapImage(new Uri(fileName, UriKind.Absolute)); } public string Label { get { return label; } }
public string FileName { get { return fileName; } }
public string GroupName { get { return groupName; } } public BitmapSource Bitmap { get { return bitmap; } } }
對DataTemplate 稍作修改,添加圖片標簽<Label>。
<s:SurfaceWindow.Resources> <DataTemplate x:Key="LibraryBarItemTemplate"> <Grid> <Image Source="{Binding Bitmap}"/> <Label FontSize="14" Content="{Binding Label}"/> </Grid> </DataTemplate> </s:SurfaceWindow.Resources> <Grid> <s:LibraryBar x:Name="mLibraryBar" Rows="2" ItemTemplate="{StaticResource LibraryBarItemTemplate}"/> </Grid>
依據GroupName 作為分組的方式,為GroupDescriptions 默認的集合瀏覽方式添加PropertyGroupDescription 對象,并賦給ItemsSource 屬性。
ObservableCollection<PhotoAlbum> items = new ObservableCollection<PhotoAlbum>(); string imagesPath = @"C:\Users\Public\Pictures\Sample Pictures\"; items.Add(new PhotoAlbum(imagesPath + "Hydrangeas.jpg", "Hydrangeas", "Nature")); items.Add(new PhotoAlbum(imagesPath + "Lighthouse.jpg", "Lighthouse", "Nature")); items.Add(new PhotoAlbum(imagesPath + "Tulips.jpg", "Tulips", "Nature")); items.Add(new PhotoAlbum(imagesPath + "Jellyfish.jpg", "Jellyfish", "Animal")); items.Add(new PhotoAlbum(imagesPath + "Koala.jpg", "Koala", "Animal")); items.Add(new PhotoAlbum(imagesPath + "Penguins.jpg", "Penguins", "Animal")); mLibraryBar.ItemsSource = items; ICollectionView defaultView = CollectionViewSource.GetDefaultView(items); defaultView.GroupDescriptions.Add(new PropertyGroupDescription("GroupName"));
從上面的示例中可以發現,我們無法將圖片從LibraryBar 中拖拽出來,當拖拽操作結束后圖片會自動返回到LibraryBar。接下來將實現把圖片拖拽到ScatterView 控件。
首先,對XAML 控件進行下修改,將LibraryBar 放入ScatterView 控件。這里需要將ScatterView 的AllwoDrop 屬性設為True,背景也要填充顏色,可設置為Transparent 透明,這樣才能保證LibraryBar 中的組件可以拖拽到ScatterView 中。
<Grid> <s:ScatterView x:Name="scatterView" s:SurfaceDragDrop.Drop="scatterView_Drop" AllowDrop="True" Background="Transparent"> <s:ScatterViewItem Width="500" Height="300"> <s:LibraryBar x:Name="mLibraryBar" Rows="2" ItemTemplate="{StaticResource LibraryBarItemTemplate}"/> </s:ScatterViewItem> </s:ScatterView> </Grid>
其次,為ScatterView 添加SurfaceDragDrop.Drop 事件用于處理拖拽的操作。在事件觸發時,新建一個ScatterViewItem(newItem) 用于裝載被拖動的圖片組件。將e.Cursor.Data 轉化為PhotoAlbum,借助FileName 屬性新建MediaElement。將MediaElement(mediaItem)賦給newItem.Content,并通過GetPosition 獲取到拖拽動作的位置作為newItem 在ScatterView 中的顯示位置。
private void scatterView_Drop(object sender, SurfaceDragDropEventArgs e) { PhotoAlbum data = e.Cursor.Data as PhotoAlbum; ScatterViewItem newItem = new ScatterViewItem(); MediaElement mediaItem = new MediaElement(); mediaItem.Source = new Uri(data.FileName); newItem.Background = Brushes.Transparent; newItem.Content = mediaItem; newItem.Center = e.Cursor.GetPosition(scatterView); scatterView.Items.Add(newItem); }
這樣我們就實現了將LibraryBar 中的組件拖拽到ScatterView。MSDN 上也提供了文檔供大家參考:Using the Microsoft Surface Drag-and-Drop Framework
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。