WPFのデータリストからクリック可能な画像のグリッドを作成するにはどうすればよいですか?
-
01-10-2019 - |
質問
私はベテランCとJavaプログラマーですが、絶対的なWPF初心者です。
ユーザーがクリックする製品の画像のリストを表示して製品の詳細を表示し、注文する可能性があるキオスクアプリケーションを作成しています。
私は構造とテストの利点に慣れているため、MVVM Foundationでアプリを構成しようとしています。
画面を左から右、上から下まで埋めるクリック可能な画像のグリッドを作成する最も自然な方法は何だろうか(または、正確な要件がありません)。
任意の画像は、電流になり、次の画面に表示されるオブジェクトにバインドする必要があります。ご協力いただきありがとうございます。
解決
わかった!聞いて!これがあなたがそれをする方法です! :) 1)ItemsControlを均一なグリッドと一緒に使用して、自動アリジュメントを取得します
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid>
</UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<Button Width="50" Height="50"/>
<Button Width="50" Height="50"/>
<Button Width="50" Height="50"/>
</ItemsControl>
2)viewmodelからのデータに項目制御を入力します
<ItemsControl ItemsSource="{Binding Path=ImageList}"...
public ObservableCollection<ClickableImage> ImageList
{
get { return m_ImageList;}
}
... constructor
{
m_ImageList = new ObservableCollection<ClickableImage>();
m_ImageList.Add(new ClickableImage("image.png");
}
タダアア!
他のヒント
コードを少し洗練しました。これが名前空間宣言です
xmlns:vm="clr-namespace:TestSandbox.ViewModels"
datacontext
<UserControl.DataContext>
<vm:ViewModel1/>
</UserControl.DataContext>
そして均一なグリッド
<ItemsControl Name="imageList" ItemsSource="{Binding Path=Products}" BorderBrush="#FFA90606" Background="#FFE70F0F">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Margin="50">
</UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- The Image binding -->
<Image Source="{Binding Path=image}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
これがビューモデルのC#コードです
public List<Product> Products {get; set; }
public ViewModel1()
{
Products = new List<Product>();
Products.Add(MakeProduct(@"..\images\beemovie.jpg"));
Products.Add(MakeProduct(@"..\images\darkknight.jpg"));
Products.Add(MakeProduct(@"..\images\matrix.jpg"));
Products.Add(MakeProduct(@"..\images\milo.jpg"));
Products.Add(MakeProduct(@"..\images\superhero.jpg"));
Products.Add(MakeProduct(@"..\images\twilight.jpg"));
Products.Add(MakeProduct(@"..\images\xfiles.jpg"));
}
public Product MakeProduct(string path)
{
return new Product(path, MakeImage(path));
}
public BitmapImage MakeImage(string path)
{
BitmapImage bmpi = new BitmapImage();
bmpi.BeginInit();
bmpi.UriSource = new Uri(path, UriKind.Relative);
bmpi.EndInit();
return bmpi;
}
ViewModel add ObservableList<ClickableImage> m_Images
公有財産として。 XAMLの使用で ListView
表示するため ClickableImage
。 dataTemplateを作成します ClickableImage
画像と上昇したコマンドUpponをクリックします。
xamlで:
<Button Command="{Binding Path=OnClickCommand}"/>
ビューモデルで:
public ICommand OnClickCommand {
get
{
return new RelayCommand(aram => this.Click(), param => this.CanClick);
}
}
public void Click() {
//i was clicked!
globalBigImageViewModel.BigImageContent = m_Image;
}
所属していません StackOverflow