0

ほぼ同じ問題の質問を見つけましたが、良い答えではありません:

バックグラウンドワーカーでいくつかの写真をダウンロードし、次のようにリストビューに設定します:

    void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            lsvHeros.Dispatcher.BeginInvoke(new Action(() => lsvHeros.ItemsSource = null));
            _heros = CountersHandler.GetCounters(e.Argument.ToString());
        }
        catch (Exception ex)
        {
            _heros = new List<Hero>();
        }
    }

グリッドは次のように定義されます。

            <ListView x:Name="lsvHeros" Height="140"  Width="160">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="" Width="40">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Image Source="{Binding HeroIcon}" Width="24" Height="24"  />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn  Width="110" DisplayMemberBinding="{Binding HeroName}" Header="" />
                    </GridView>
                </ListView.View>
            </ListView>

次に、done イベントで itemsourc を設定します。

    void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        lsvHeros.ItemsSource = _heros;
        SetWaitMode(false);
        txbHeroName.Select(0, txbHeroName.Text.Length);
        txbHeroName.Focus();
    }

問題: itemssource を null に設定しても、ダウンロードした写真はロックされたままです。バインドしないといつでも削除できるため、バインドの問題は間違いありません。

フォルダー内の写真を手動で削除したい場合、別のプロセスによってロックされていることがわかります。

プログラムを再実行したときに写真を削除できるように、写真のロックを解除する適切な解決策はありますか?

ご返信ありがとうございます

ミュラー・マティアス

PSは、ファイルをダウンロードする方法が重要だとは思いませんでした。基本的に、ページの HTML テキスト全体をダウンロードし、知っているパターンを検索してからダウンロードします。コードは次のとおりです。

    private static Hero HandleCounter(string str)
    {
        const string IMG = @"img src=""";
        Hero result = new Hero();

        string picture = str.Substring(str.IndexOf(IMG) + IMG.Length);
        picture = picture.Substring(0, picture.IndexOf("png", 0) + 3);


        string file = Path.Combine(FileHandler.GetFilePath(ImagePath.Counters), Path.GetFileName(picture));

        File.Create(file).Dispose();

        using (WebClient client = new WebClient())
        {
            client.DownloadFile(picture, file);
        }
        result.HeroIcon = file;

        result.HeroName = Path.GetFileNameWithoutExtension(file).ToLower();
        result.HeroName = result.HeroName.Substring(0, 1).ToUpper() + result.HeroName.Substring(1);

        return result;
    }

GetFilePath はローカル パスを取得します。

    public  static string GetFilePath(ImagePath iP)
    {
        string result = Path.Combine(Directory.GetCurrentDirectory(), "Images", iP.ToString());
        if (!Directory.Exists(result))
            Directory.CreateDirectory(result);

        return result;
    }

これは私が楽しみのために作った単なるプログラムなので、明らかに適切にコーディングされていません。たとえば、ディレクトリを頻繁に作成および削除します。

4

0 に答える 0