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

让我们考虑一下ViewModels:

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


我想让UserControl显示这样的ViewModels in this way (two ways)

1)二维列表状控件。

2)二维Coverflow类控制。

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

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

有没有人实现过这样的二维UserControl?

最好的祝福,
哔叽。

最佳答案

我可以想到两种方法来实现它,但是我现在没有编译器来测试这两种方法。


方法一是覆盖诸如ListBox之类的模板(因为您要跟踪SelectedItem),以使SelectedItem始终位于同一位置。更改SelectedItem(通过鼠标或箭头键)只会将新项目移动到列表的中心。

这可用于文件和目录。使目录使用模板的水平版本,并使ItemTemplateSelectedItem(使用DataTrigger)包含文件的模板的垂直版本。
我可以想到的另一种方式是使用ItemsControls和子集合显示下一个/上一个3个文件/目录。

您可以使用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>

关于c# - “二维” UserControl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8955055/

10-12 13:05