如何从WPF中的数据列表中创建可点击图像网格?

时间:2010-04-27 08:17:15

标签: mvvm wpf-controls binding clickable-image

我是一名经验丰富的C和Java程序员,但绝对是WPF的新手。

我正在创建一个自助服务终端应用程序,该应用程序将显示用户将点击以查看产品详细信息并可能下订单的产品图像列表。

我正在尝试使用MVVM Foundation构建我的应用程序,因为我已经习惯了结构和测试的好处。

我想知道创建可点击图像网格的最自然方式是什么,它将从左到右,从上到下填充屏幕(或者反过来,我没有确切的要求)。

任何图像都应绑定到一个将变为当前的对象并显示在下一个屏幕中。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

OK!听着!这是你如何做到的! :) 1)将ItemsControl与UniformGrid一起使用以获得自动对齐

<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
<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");
}

TADAAAA!

答案 1 :(得分:3)

我提炼了一点代码。这是名称空间声明

xmlns:vm="clr-namespace:TestSandbox.ViewModels"

DataContext

<UserControl.DataContext>
    <vm:ViewModel1/>
</UserControl.DataContext>

和uniformGrid

<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;
    }

答案 2 :(得分:1)

在ViewModel中添加ObservableList<ClickableImage> m_Images作为公共属性。 在XAML中,使用ListView来显示ClickableImage。 使用Image创建ClickableImage的数据窗口并使用凸起命令uppon click。

在XAML上:

<Button Command="{Binding Path=OnClickCommand}"/>  

在ViewModel上:

public ICommand OnClickCommand {
    get
    {
        return  new RelayCommand(aram => this.Click(), param => this.CanClick);
    }
}
public void Click() {
        //i was clicked!  
        globalBigImageViewModel.BigImageContent = m_Image;
}