章节前言
文章有点而像技术备忘录了,不断的贴代码,宝妈说这截图不好看,于是有又加了功能在图片上可以右键菜单,随机取一张替换。
WPF右键菜单
元素中添加右键菜单
<Image Width="240" Height="240" Source="{Binding PicturePath}" RenderOptions.BitmapScalingMode="NearestNeighbor" CacheMode="BitmapCache" Stretch="Uniform" >
<Image.ContextMenu >
<ContextMenu Width="150" VerticalAlignment="Center" HorizontalContentAlignment="Left">
<MenuItem Header="随机更换封面" Command="{Binding Source={StaticResource Locator},Path=Main.UpdateImagesCommand}" CommandParameter="{Binding FolderPath}">
<MenuItem.Icon>
<Button Style="{StaticResource ButtonIconCircular.Small}" hc:IconElement.Geometry="{StaticResource RotateRightGeometry}"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</Image.ContextMenu>
</Image>
后台代码更换图片
/// <summary>
/// 点击更换封面
/// </summary>
public RelayCommand<string> UpdateImagesCommand
{
get
{
var command = new RelayCommand<string>((string path) =>
{
foreach (var item in VideoList)
{
if (item.FolderPath == path)
{
string pathOld = item.PicturePath; //原图
string pathTemp = item.FolderPath + "\\temp_" + System.DateTime.Now.ToString("mmssff") + ".jpg"; //临时
string pathPreview = item.FolderPath + "\\_preview_" + System.DateTime.Now.ToString("mmssff") + ".jpg"; //预览图
item.PicturePath = null;
string[] _fileVideos = Utils.GitFileVideos(item.FolderPath);
Common.VideoSnapshot.ExtractSnapshot(_fileVideos[0], pathTemp, System.DateTime.Now.Second); //临时预览图生成,方法二
if (File.Exists(pathTemp))
{
Common.ThumbnailMaker.MakeThumbnail(pathTemp, pathPreview, 200, 200, Common.ThumbnailMode.Cut);
item.PicturePath = pathPreview;
File.Delete(pathTemp); //删除临时
Task.Run(() =>
{
Thread.Sleep(3000); //目的是等待回收资源从能删除
File.Delete(pathOld); //删除旧图
});
}
break;
}
}
});
return command;
}
}
资源回收
在.NET 的项目中,应用软件长期使用,内存占用就莫名的高,当然了这和开发者的代码有关系,这里我提到这一机制的原因是因为在更换封面图片时,一直 提示 “另一个程序正在使用此文件,进程无法访问”,无法删除文件。
理论上更换了图片,旧图就不应该被占用,但事实就是奇葩,坐等自动回收或者给图片标签加上RenderOptions.BitmapScalingMode="NearestNeighbor" CacheMode="BitmapCache" 类似属性也不行。
只能自己了,调用园中一高人写的 Lierda.WPFHelper
WPF内存优化_lierda.wpfhelper-CSDN博客
示例代码:
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
LierdaCracker cracker = new LierdaCracker();
protected override void OnStartup(StartupEventArgs e)
{
cracker.Cracker(100);//垃圾回收间隔时间
base.OnStartup(e);
}
}
ico图标清晰
快捷方式的图标,在不同分辨率上显示模糊,确实难看,之前没注意,重新生成能支持不同分辨率的 ICO, ICO Convert - Create Icons From PNG & JPG Images Online
Qt 软件图标ICO太小/不清晰的解决方法_ico转换的图太小-CSDN博客
开源地址:来自宝妈的需求 一仔播放器 WPF 开源项目: 宝妈的需求“一仔播放器” WPF 的开源项目 HandyControl、MwvmLight