列表框,其中项目具有多个可选区域

发布于 2024-10-09 19:55:40 字数 429 浏览 6 评论 0原文

我不确定在 WPF 中实现此功能的最佳方法,因此我首先说明我的问题。

我有一个框架集合。每帧有两个图像。假设我有 10 个帧,总共 20 张图像。我想在屏幕底部显示像胶片一样组织的图像 - 2 行和 10 列。当用户单击其中一张图像或使用箭头时,它应该被选中,并且所选图像信息将在应用程序的其他地方使用。

我已将其实现为 ListBox,其中 ItemsSource 绑定到我的视图模型的 Frames 集合(可观察集合)。在列表框的数据模板中,我创建了一个包含两行的网格,每行包含一个图像控件。第 0 行的一个绑定到 TopImage(我的 Frame 类的一个属性),底部的一个绑定到 BottomImage。

所有这些工作都有效,但问题是当我使用箭头时,整个框架(项目)都会被选中。如何单独选择数据模板中的每个图像?

或者

有没有更好的方法来实现这个>

I'm not sure about the best way to implement this in WPF, so I'll state my problem first.

I have a collection of frames. Each frame has two images. Let's say I have 10 frames giving a total of 20 images. I want to show the images at the bottom of the screen organized like a film strip - 2 rows and 10 columns. When the user clicks on one of this images or uses the arrow, it should become selected and the selected image information will be used somewhere else in the application.

I've implemented it as a ListBox with ItemsSource bound to my viewmodel's Frames collection (an observablecollection). In the DataTemplate of the ListBox, I've created a grid with two rows, each one containing a Image control. The one on row 0 is bound to TopImage (a property of my Frame class) and the bottom one is bound to BottomImage.

All this work, but the problem is that when I use the arrows, the whole frame (item) gets selected. How do I select each image in the datatemplate individually?

OR

Is there a better way to implement this>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心清如水 2024-10-16 19:55:40

您有两个问题:

  • 您想要将框架中上部和下部图像的选择性分开
  • 您希望箭头键能够在二维中导航图像

如果您没有箭头键要求,那么您可以解决第一个 问题通过在父 ItemsControl 中嵌套 ListBox 对象来解决此问题。但是箭头只能在 ListBox 中做正确的事情。要解决这个问题需要采取不同的方法。

这是一个绑定到四元素图像集合的 2x2 网格数据。在这里,我们使用很少使用的 UniformGrid 来使集合在这么多列之后换行。由于我们使用 ItemsControl,我们失去了自动选择支持,但我们通过使 Image 控制 Button 的内容来恢复它。

<Grid>
    <Grid.Resources>
        <x:Array x:Type="sys:String" x:Key="sampleData">
            <sys:String>http://thecybershadow.net/misc/stackoverflow.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/sourceforge.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/stackoverflow.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/sourceforge.png</sys:String>
        </x:Array>
    </Grid.Resources>
    <ItemsControl ItemsSource="{StaticResource sampleData}" Focusable="False">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="2"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button>
                    <Button.Content>
                        <Image Source="{Binding}"/>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

最终效果是一个 2x2 的图像网格,您可以在它们之间自由移动。您可以使用样式来使按钮外观不那么像按钮,而不会失去可聚焦性。因此,将所有二十个图像绑定到此视图,首先是前十个,然后是后十个。您还可以绑定来自同一数据源的列计数。

You have two problems:

  • You want to separate the selectability of the upper and lower images in a frame
  • You want the arrow keys to be able to navigate images in two dimensions

If you did not have the arrow key requirement, then you could solve the first problem by nesting ListBox objects inside a parent ItemsControl. But then the arrows only do the right thing within a ListBox. To address that requires a different approach.

Here is a 2x2 grid data-bound to a four-element collection of images. Here we use the little-used UniformGrid to cause the collection to wrap after so many columns. Since we're using an ItemsControl, we lose automatic selection support but we get it back by making the Image control the content of a Button.

<Grid>
    <Grid.Resources>
        <x:Array x:Type="sys:String" x:Key="sampleData">
            <sys:String>http://thecybershadow.net/misc/stackoverflow.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/sourceforge.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/stackoverflow.png</sys:String>
            <sys:String>http://thecybershadow.net/misc/sourceforge.png</sys:String>
        </x:Array>
    </Grid.Resources>
    <ItemsControl ItemsSource="{StaticResource sampleData}" Focusable="False">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="2"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button>
                    <Button.Content>
                        <Image Source="{Binding}"/>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

The net effect is a 2x2 grid of images that you can freely arrow around between. You can use styling to make the button aspect less button-like without losing focusability. So bind all twenty images to this view, first the top ten and then the bottom ten. You can also bind the column count from the same data source.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文