0

私は C# と WPF でのプログラミングの初心者でListView、すべてのアイテムがバインドされた 2 つのファイル マネージャーを作成しています。ファイル/フォルダーのアイコンとその名前が必要なため、いくつListViewGridViewColumnの s があり、最初に持っています。CellTemplateCellTemplate

<DataTemplate x:Key="IconTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Image Source="{Binding Path=itemIcon}" Width="20" Grid.Column="0"/>
                <TextBlock Grid.Column="1" Text="{Binding Path=itemName}" />
            </Grid>
        </DataTemplate>

そして、すべてのディレクトリとファイルがコレクションに追加され、すべてのファイルのアイコンがファイルから変換される ObservableCollection という 1 つの Class がありました。MyItem クラスには、名前、拡張子などのいくつかの文字列と、それらのアイコン用の 1 つの ImageSource が含まれています。それらのアイコンを変換するために、異なるファイルを含むいくつかのフォルダーがプログラムをフリーズすることに気付くまで、すべてうまくいきました。だから今、私はすべてのファイルにいくつかの一般的なアイコンをバインドしてから、別のスレッドで変換して変更したいと考えています。そのため、メインクラスでアイテムのグローバル ObservableCollection を作成しましたが、listView からアイテムをロードする方法がわからないため、塗りつぶし Collection 関数を Observable クラスからメインクラスに移動しました。今私は' 新しいスレッドからリストビューの項目を変更できますが、最終的に問題が発生します-XamlParseExceptionが発生します-DependencyObjectと同じスレッドでDependencySourceを作成する必要があります。ファイルの名前(文字列)を変更しようとすると、完全に機能しました(これまでのところ、ボタンのクリックでのみテストしています)!インターネットで見つけた参照に従って、依存関係オブジェクトを MyItem クラスに実装しようとしましたが、うまくいきませんでした。この変化するアイコン機能。

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++)
        {
            FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name);
            ImageSource imgSource = some.Icon;
            leftFilesLoad[i].itemIcon = imgSource;
            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
                    {
                        contentLeft.Items.Refresh();
                    }
            );

かなり長い記事で、stackoverflow は具体的に言う:-D. みんな助けてくれて本当にありがとう。返信をお待ちしております。必要なすべてのコードをお見せする準備ができています。

4

1 に答える 1

1

ImageSource非 UI スレッドでを作成しているため、例外が発生しています。オブジェクトを凍結しない限り、これを行うことはできません。すべての UI 関連のロジックをBeginInvoke呼び出しに含める必要があります。代わりにこれを試してください

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++)
{
           this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
           {
               FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name);
               ImageSource imgSource = some.Icon;
               leftFilesLoad[i].itemIcon = imgSource;
               contentLeft.Items.Refresh();
            }
    );
}

これにより、すべての UI 関連のアクティビティが UI スレッドに保持されます。

于 2013-01-10T05:51:43.110 に答える