WPF开发中遇到的新知识 -- 10

前言

在开发自己使用的日志查看小工具,日志查看的界面是准备做成上下分层,上层是日志内容,下层是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搭配事件的方式,以又快又好的方式达到目的

posted @   huang1993  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示