首页 > 其他分享 >WPF开发中遇到的新知识 -- 10

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

时间:2022-10-08 11:13:02浏览次数:63  
标签:10 方式 MVVM 文件 -- LogList 拖拽 WPF 日志

前言

在开发自己使用的日志查看小工具,日志查看的界面是准备做成上下分层,上层是日志内容,下层是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

相关文章

  • 2022-2023-1 20221307 《计算机基础与程序设计》 第六周学习总结
    教材学习内容总结Polya解决问题的方法:1.理解问题2.找到数据与未知数的关系(辅助问题)3.执行方案4.分析解决方案简单类型与组合类型:组合类型:指能够表示多个数据的类型复合数......
  • ABAP 选择屏幕内的类型以及使用
    选择屏幕组件主要记录了ABAP编程中选择屏幕常用的组件选择框范围选择框radio单选check选择单行展现配合radio和check使用较多下拉框自定义下拉框按钮文件框文......
  • 把jar包添加到本地仓库
    mvninstall:install-file-DgroupId=com.alipay-DartifactId=trade-sdk-Dversion=1.0.0-Dpackaging=jar-Dfile=alipay-trade-sdk-1.0.0.jar-DgroupId:表示jar对应的gr......
  • TCP与UDP的联系与区别
    TCP(TransmissionControlProtocol,传输控制协议)他是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。这说明TCP连接是一个非常复杂的过程,需要进行“三......
  • Java基础——接口
    一、什么是接口抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,就是更加特殊的“抽象类”——接口接口是Java中的引用类型,它类似于类,它是抽象方法的集合。......
  • Java基础——抽象类
    一、什么是抽象类后面会有各种类来继承父类,但是并不是所有继承了父类的子类都要做同一件事的。比如狗类和猫类都继承了动物这个父类,但是吃东西的话就不是吃一个东西。不......
  • 453 最小操作次数使数组元素相等
      思路:题目说只需要找出让数组所有元素相等的最小操作次数,所以不需要考虑数组中各个元素的绝对大小,即不需要真正算出数组中所有元素相等时的元素值,只需要考虑数组中元......
  • Flutter(四):Flutter 语言 Dart基础使用
    一、变量和常量变量vara=1;varstr='abc';常量constPI=3.14;不可变对象finalPI=3.14;finalTIME=newDateTime.now()二、流程控制语句if(year......
  • 学习PLC的15个基础
    从事电力作业的人员都知道,工业生产和科技的发展都离不开PLC的自动化控制,PLC可以广义的理解为:集中的继电器延伸控制柜,实际的生产应用中,PLC大大的节省了工业控制的成本,加强了......
  • PADS应用笔记:Layout时设置覆铜平面的过孔样式(热焊盘)方法
    问题对于覆铜平面连接到同网络的过孔时我们常常有一定要求,这时候要怎么设置呢方法通过在设置选项里设置覆铜平面的热焊盘选项来设置覆铜平面和过孔的连接方法,一般可以设......