溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

WPF 與Surface 2.0 SDK 親密接觸–LibraryBar 篇

發(fā)布時(shí)間:2020-06-23 16:34:15 來(lái)源:網(wǎng)絡(luò) 閱讀:368 作者:gnie 欄目:開(kāi)發(fā)技術(shù)

LibraryBar 介紹

     與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)兩行模式:

WPF 與Surface 2.0 SDK 親密接觸–LibraryBar 篇

三行模式:

WPF 與Surface 2.0 SDK 親密接觸–LibraryBar 篇

LibraryBar 分組

     接下來(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"));

WPF 與Surface 2.0 SDK 親密接觸–LibraryBar 篇

LibraryBar 拖拽

     從上面的示例中可以發(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

WPF 與Surface 2.0 SDK 親密接觸–LibraryBar 篇

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI