3

我正在尝试实现自定义用户控件。

让我们考虑一下 ViewModel:

public class FileViewModel
{
    public string Name { get; set; }
    public BitmapSource Thumbnail { get; set; }
}

public class DirectoryViewModel
{
    public string Name { get; set; }
    public ObservableCollection<FileViewModel> Files { get; private set; }
    public FileViewModel SelectedFile { get; set; }
}

我想要以这种方式(两种方式)显示此类 ViewModel 的 UserControl :

1)二维列表式控制。

2)二维coverflow-like控制。

请注意,每个文件都有它的缩略图,每个目录都会记住上次查看的文件。如果未选择目录,则目录应显示上次查看的文件缩略图(作为其自己的)。

通过使用左右键和适当的按钮来更改目录选择。通过使用上下键和适当的按钮来更改文件选择。

有没有人像这样实现了一些二维用户控件?

最好的问候,塞尔吉。

4

1 回答 1

0

我可以想到两种方法来解决它,但我现在没有编译器来测试任何一种方法。

  • 方法一是覆盖类似 a 的模板ListBox(因为您想跟踪SelectedItem),以便SelectedItem始终在同一个位置。更改SelectedItem(通过鼠标或箭头键)只会将新项目移动到列表的中心。

    这可用于文件和目录。使目录使用模板的水平版本,并让它ItemTemplateSelectedItem使用 a DataTrigger)包含文件模板的垂直版本。

  • 我能想到的另一种方法是使用ItemsControls和子集合显示下一个/上一个文件/目录。

    您可以使用 Linq 语句根据初始集合和当前项目获取上一个/下一个集合。例如,MyCollection.Skip(MyCollection.IndexOf(SelectedItem)).Take(3)

    <Grid>
        <RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefintiion Height="Auto" />
            <RowDefinition Height="*" />
        </RowDefinitions>
        <ColumnDefinitions>
            <ColumnDefinition Height="*" />
            <ColumnDefinition Height="Auto" />
            <ColumnDefinition Height="*" />
        </ColumnDefinitions>

        <!-- Previous 3 Files -->
        <ItemsControl Grid.Row="0" Grid.Column="1"
                      ItemsSource="{Binding Previous3Files}"
                      ItemTemplate="{StaticResource FileTemplate}"
                      ItemsPanel="{Binding VerticalStackPanel}" />

        <!-- Next 3 Files -->    
        <ItemsControl Grid.Row="2" Grid.Column="1"
                      ItemsSource="{Binding Next3Files}"
                      ItemTemplate="{StaticResource FileTemplate}"
                      ItemsPanel="{Binding VerticalStackPanel}" />

        <!-- Previous 3 Directories-->
        <ItemsControl Grid.Row="1" Grid.Column="0"
                      ItemsSource="{Binding Previous3Directories}"
                      ItemTemplate="{StaticResource DirectoryTemplate}"
                      ItemsPanel="{Binding HorizontalStackPanel}" />

        <!-- Next3 Directories-->
        <ItemsControl Grid.Row="1" Grid.Column="2"
                      ItemsSource="{Binding Next3Directories}"
                      ItemTemplate="{StaticResource DirectoryTemplate}"
                      ItemsPanel="{Binding HorizontalStackPanel}" />

        <!-- Current Item -->
        <ContentControl Grid.Row="1" Grid.Column="1"
                        Content="{Binding SelectedFile}"
                        ContentTemplate="{Binding FileTemplate}" />
        </ContentControl>
    
    </Grid>
于 2012-01-22T20:19:43.480 回答