ほぼ同じ問題の質問を見つけましたが、良い答えではありません:
バックグラウンドワーカーでいくつかの写真をダウンロードし、次のようにリストビューに設定します:
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;
}
これは私が楽しみのために作った単なるプログラムなので、明らかに適切にコーディングされていません。たとえば、ディレクトリを頻繁に作成および削除します。