前言
在开发自己使用的日志查看小工具,日志查看的界面是准备做成上下分层,上层是日志内容,下层是Json格式的日志内容的格式化后的展示,然后上层是将日志文件的每一行作为ListboxItem加载,然后在点击了某一项之后,如果日志内容是Json格式的,就会格式化Json之后在下层展示,这样方便检查数据,这样就不会每次查看日志的时候眼花缭乱了
一、CommunityToolkit.Mvvm 库
考虑到界面会非常简单,所以就没有使用Prism,而是使用社区工具包里面的MVVM工具 CommunityToolkit.Mvvm
,足够轻量,简单,易用
1.1 构建骨架
关于这部分内容,就不记录了,因为这个包有一个配套的 MVVM Toolkit Sample App
,就在Windows商城里面就有,安装之后,入门就有了,大致分为通知更新、命令、消息发送接受和Ioc这几块常见的东西,使用起来确实很轻量
二、ListBox滚动至特定项
有一个搜索功能,现在就有一个要求,就是在搜索后,自动滚动到第一个搜索结果的那一行,然后发现使用MVVM的方式,不会做,直接设置SelectedItem的方式行不通,最后还是使用了事件的方式
private void Button_Click(object sender, RoutedEventArgs e)
{
var res = LogList.ItemsSource.OfType<string>().FirstOrDefault(a => a.Contains(SearchTextBox.Text));
if (res is null) return;
LogList.ScrollIntoView(res);
LogList.SelectedItem = res;
}
只有Listbox提供的这个 ScrollIntoView
方法,最简单的达到目的了
三、拖拽打开文件
虽然已经实现了文件对话框的方式打开文件,但是稍显繁琐,用户体验最好的方式还是拖拽打开,最后发现MVVM的方式还是不知道怎么做,关键信息文件路径
无法获取,最后是通过事件搭配消息通知的方式达到目的
<ListBox x:Name="LogList"
Grid.Row="1"
AllowDrop="True"
DragEnter="LogList_DragEnter"
Drop="LogList_Drop"
ItemsSource="{Binding LogContent}"
SelectedItem="{Binding SelectedItem,Mode=TwoWay}"/>
- AllowDrop:允许拖拽
- DragEnter:拖拽进来的事件
- Drop:松开鼠标后的事件
// 设置连接文件的方式
private void LogList_DragEnter(object sender, DragEventArgs e)
{
e.Effects = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Link : DragDropEffects.None;
}
// 实际的文件处理方法
private void LogList_Drop(object sender, DragEventArgs e)
{
try
{
var fileName = ((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
WeakReferenceMessenger.Default.Send(new LoggerFileMessage(fileName ?? ""));
}
catch (Exception exception)
{
MessageBox.Show($"文件拖拽出错: {exception.Message}");
}
}
在成功获取到文件的路径之后,通过发布消息的方式,通知ViewModel打开文件
结尾
MVVM搭配事件的方式,以又快又好的方式达到目的
标签:10,方式,MVVM,文件,--,LogList,拖拽,WPF,日志 From: https://www.cnblogs.com/huangwenhao1024/p/16768330.html