我正在尝试实现自定义用户控件。
让我们考虑一下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)二维罩流控制。
请注意,每个文件都有缩略图,每个目录都会记住上次查看的文件。如果未选择目录,目录应显示上次查看的文件缩略图(作为其自己的缩略图。)
使用左右键和相应的按钮更改目录选择。 使用上下键和相应的按钮更改文件选择。
有没有人像这样实现了一些二维UserControl?
祝你好运, 哔叽。
答案 0 :(得分:0)
我可以想到两种方法来处理它,但我现在没有编译器来测试任何一种方法。
方法一是覆盖ListBox
之类的模板(因为你想跟踪SelectedItem
),以便SelectedItem
总是在同一个地方。更改SelectedItem
(通过鼠标或箭头键)只会将新项目移动到列表的中心。
这可以用于文件和目录。使目录使用模板的横向版本,并使ItemTemplate
SelectedItem
(使用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>