您好,登錄后才能下訂單哦!
與LibraryStack 類(lèi)似LibraryBar 也屬于ItemsControl,在LibraryBar 里的組件會(huì)以水平平鋪方式展示,并且也可以對(duì)其中的組件進(jìn)行按組分類(lèi)。同樣LibraryBar 也是默認(rèn)支持拖拽操作。
下面的例子將通過(guò)LibraryBar 展示一組Sample 圖片。首先,仍然可以使用DataTemplate 作為L(zhǎng)ibraryBar 的樣式模板用來(lái)綁定圖片資源。接下來(lái)在Grid 中添加LibraryBar 控件,并設(shè)置好ItemTemplate 數(shù)據(jù)模板。我們可以通過(guò)修改Rows 參數(shù)調(diào)整LibraryBar 中組件顯示的行數(shù)。
<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>
為L(zhǎng)iraryBar 添加圖片數(shù)據(jù)源。注意,同樣不能將圖片string[] 數(shù)組直接賦給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. }
默認(rèn)兩行模式:
三行模式:
接下來(lái)我們將圖片進(jìn)行分組操作,先增加一個(gè)PhotoAlbum 類(lèi),其中包含圖片的路徑、標(biāo)簽、組名信息。
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; } } }
對(duì)DataTemplate 稍作修改,添加圖片標(biāo)簽<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>
依據(jù)GroupName 作為分組的方式,為GroupDescriptions 默認(rèn)的集合瀏覽方式添加PropertyGroupDescription 對(duì)象,并賦給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"));
從上面的示例中可以發(fā)現(xiàn),我們無(wú)法將圖片從LibraryBar 中拖拽出來(lái),當(dāng)拖拽操作結(jié)束后圖片會(huì)自動(dòng)返回到LibraryBar。接下來(lái)將實(shí)現(xiàn)把圖片拖拽到ScatterView 控件。
首先,對(duì)XAML 控件進(jìn)行下修改,將LibraryBar 放入ScatterView 控件。這里需要將ScatterView 的AllwoDrop 屬性設(shè)為T(mén)rue,背景也要填充顏色,可設(shè)置為T(mén)ransparent 透明,這樣才能保證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 事件用于處理拖拽的操作。在事件觸發(fā)時(shí),新建一個(gè)ScatterViewItem(newItem) 用于裝載被拖動(dòng)的圖片組件。將e.Cursor.Data 轉(zhuǎn)化為PhotoAlbum,借助FileName 屬性新建MediaElement。將MediaElement(mediaItem)賦給newItem.Content,并通過(guò)GetPosition 獲取到拖拽動(dòng)作的位置作為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); }
這樣我們就實(shí)現(xiàn)了將LibraryBar 中的組件拖拽到ScatterView。MSDN 上也提供了文檔供大家參考:Using the Microsoft Surface Drag-and-Drop Framework
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。