前言
最近因為課程專案的需要,所以使用Lsh(Locality Sensitive Hashing)實作以圖搜圖的關係,所以需要讓查詢的相似圖片在視窗中排序列出,於是便花了一些時間尋找資料簡單的用ListBox實作出此功能。
實作方式
由於本人是使用C# WPF環境,所以首先來看XAML的部分
定義自己要在ListBox顯示的元件
此部分是定義屬於你ListBox要顯示的資料,此範例包含文字與圖像,並透過ItemTemplate設定DataTemplate用來顯示每個項目
使用DataTemplate來定義資料物件的外觀。在此部分使用設定顯示時有TextBlock 與Image,並且對TextBlock的Text與Image的Source分別繫結Str與Image資料;此部分的繫結資料名稱來自於程式中定義的Img Class
設定顯示時為橫向排列且是垂直捲動
ListBox中另外設定ItemsPanel以取得或設定ItemsPanelTemplate樣板定義控制的項目配置的面板。
設定成WrapPanel,並且設Orientation為Vertical使物件可以wrap vertically
對ListBox設定ScrollViewer.VerticalScrollBarVisibility="Disabled" 使ScrollViewer限制住高度不會無限往下捲
<ListBox x:Name="lstBox" Height="400" Margin="413,95,44,204" ScrollViewer.VerticalScrollBarVisibility="Disabled"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <WrapPanel IsItemsHost="True" Orientation="Vertical"/> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate DataType=" {x:Type local:Img}"> <StackPanel> <TextBlock Margin="3" Text="{Binding Str}"/> <Image Margin="3" Source="{Binding Image}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>以下是個部份的介紹:
<ListBox.ItemTemplate> <DataTemplate DataType=" {x:Type local:Img}"> <StackPanel> <TextBlock Margin="3" Text="{Binding Str}"/> <Image Margin="3" Source="{Binding Image}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate>透過預先在Window指定xmlns:local="clr-namesapce:Your App NameSpace"來取得此namespace才可以在DataTemplate DataType中找的到local的Img Class
xmlns:local="clr-namesapce:LargeScaleImageSearch"
<ListBox x:Name="lstBox" Height="400" Margin="413,95,44,204" ScrollViewer.VerticalScrollBarVisibility="Disabled"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <WrapPanel IsItemsHost="True" Orientation="Vertical"/> </ItemsPanelTemplate> </ListBox.ItemsPanel>
程式碼部分
public class Img { public Img(string value, BitmapSource img) { Str = value; Image = img; } public string Str { get; set; } public BitmapSource Image { get; set; } }
TestLoad = Directory.GetFiles(@"../../ImageData/pasadena-buildings/houses/house001").ToList(); foreach(string path in TestLoad){ lstBox.Items.Add(new Img(System.IO.Path.GetFileName(path), new Image(path).Resize(160,120,INTER.CV_INTER_LINEAR).ToBitmapSource())); }
沒有留言:
張貼留言