gpt4 book ai didi

c# - "Two-dimensional"用户控件

转载 作者:行者123 更新时间:2023-11-30 18:40:01 26 4
gpt4 key购买 nike

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

让我们考虑 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; }
}

我想要显示此类 ViewModels 的 UserControl in this way (two ways) :

1) 二维列表式控件。

2)二维类覆盖流控制。

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

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

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

最好的问候,哔叽。

最佳答案

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

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

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

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

    您可以使用 Linq 语句根据初始集合和当前项目获取 Previous/Next 集合。例如,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# - "Two-dimensional"用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8955055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com