2

私はWPFの初心者ですが、これを行う必要があり、多くの時間がかかります。私は解決策を探しましたが、多くの代替解決策があり、正直なところ、これのほとんどを理解していません. 私はこのXAMLコードを持っています:

<ListView Name="Thumbnails">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}" Height="30" Width="30" Margin="5"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

このコードビハインドと同様に:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DirectoryInfo folder = new DirectoryInfo(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\SlikeSportista\");
    FileInfo[] images = folder.GetFiles("*.jpg");
    foreach (FileInfo img in images)
    {
        Thumbnails.Items.Add(img);
    }
}

foreach ループで次のコード行も試しました。

Thumbnails.Items.Add(System.Drawing.Image.FromFile(img.FullName));

どちらの場合も、アイテムは追加されますが、画像が正しく表示されないか、まったく表示されません。それらを選択でき、フォルダー内にあるのと同じ量の要素がありますが、表示はありません。

もう 1 つの問題 (あまり重要ではありません) は、画像を行ではなく正方形で表示する方法です。基本的には、1 行に約 4 枚程度の画像を配置したいのですが、今は 1 行に 1 つの要素しかなく、ずっと引き伸ばされています (ただし、表示されているものはわかりません)。

4

2 に答える 2

4

FileInfo最初の試みでは、ListView のアイテム コレクションにオブジェクトを追加しています。ImageSourceこれらは、DataTemplate のバインディングで必要なため、項目に自動的に変換されません。FullName代わりに FileInfo を追加します。

foreach (FileInfo img in images)
{
    Thumbnails.Items.Add(img.FullName);
}

2回目の試行ではSystem.Drawing.Image、WPFの一部ではなくWinFormsのインスタンスを追加し、自動的に変換されないことが問題です。BitmapImage代わりに次を使用できます。

foreach (FileInfo img in images)
{
    Thumbnails.Items.Add(new BitmapImage(new Uri(img.FullName)));
}

両方のソリューションの違いは、2 番目のソリューションでは画像オブジェクトを手動で作成するのに対し、最初のソリューションではTypeConverter として WPF に組み込まれているからstringへの自動変換に依存することです。ImageSource


2 番目の質問の解決策は、ListView のItemsPanelを、おそらく次のように置き換えることUniformGridです。

<ListView Name="Thumbnails">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="4"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    ...
</ListView>
于 2013-05-11T14:58:20.413 に答える
0

原則として、コード ビハインド ファイル (.xaml.cs ファイル) に画像を追加することはお勧めできません。WPF には、MVVM (Model-View-ViewModel) と呼ばれる非常に広く使用されている一般的なデザイン パターンがあり、よく理解して使用する必要があります。あなたの場合、IEnumerable<BitmapImage>に表示したい画像を含むプロパティを含むViewModelクラスが必要ですListView

たとえば、ViewModel クラスが ImagesViewModel と呼ばれ、ビューが ImagesView であるとします。

ImagesViewModelには次のプロパティがあります。

ObservableCollection<BitmapImage> Images

ImagesViewには以下が含まれます。

<ListView Name="Thumbnails" ItemsSource="{Binding Images}">
<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <UniformGrid Columns="4"/>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>
...

ここで、画像を画像に追加/削除すると、それらは自動的にリスト ビューに追加/削除されます (INotifyPropertyChangedビュー モデルにインターフェイスを実装する必要があり、完了です)。

于 2014-02-25T08:13:51.413 に答える