3

カスタムユーザーコントロールを実装しようとしています。

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

このようなViewModelをこのように表示するUserControlが必要です(2つの方法)

1) 2次元リストのようなコントロール。

2) 2次元のカバーフローのような制御。

各ファイルにはサムネイルがあり、各ディレクトリは最後に表示されたファイルを記憶していることに注意してください。ディレクトリが選択されていない場合、ディレクトリには最後に表示されたファイルのサムネイルが(独自のものとして)表示されます。

ディレクトリの選択は、左右のキーと適切なボタンを使用して変更されます。ファイルの選択は、上下のキーと適切なボタンを使用して変更されます。

誰かがこのような2次元のUserControlを実装したことがありますか?

よろしく、セルジュ。

4

1 に答える 1

0

アプローチする方法は 2 つ考えられますが、どちらの方法でもテストできるコンパイラが手元にありません。

  • ListBox方法 1 は( を追跡したいので)のようなもののテンプレートを上書きしSelectedItemて、SelectedItemが常に同じ場所にあるようにすることです。SelectedItem(マウスまたは矢印キーを使用して) を変更すると、新しい項目がリストの中央に移動するだけです。

    これは、ファイルとディレクトリの両方に使用できます。ディレクトリがテンプレートの水平バージョンを使用するようにし、ファイルのテンプレートの垂直バージョンItemTemplateSelectedItem(使用してDataTrigger) 含むようにします。

  • 私が考えることができるもう1つの方法は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>
于 2012-01-22T20:19:43.480 に答える