WPF-页面-DataGrid数据处理-多线程-Winform嵌入

news2025/2/27 14:02:57

页面

if(NavigationService.CanGoBack == true) NavigationService.GoBack();
NavigationService.Navigate(new Uri("Page.xaml",UriKind.Relative));
  • 打印对话框PrintDialog
  • 如果要一下启动两个窗口,可以重写App.cs中的OnStartUP方法
  • 设置窗口所属关系,窗体A.Owner=窗体B
  • 单例模式
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Mutex mutex = new Mutex(true, "MainWindow", out bool isNewInstance);
        if (!isNewInstance )
        {
            IntPtr intPtr = FindWindowW(null, "MainWindow");
            if (intPtr !=IntPtr.Zero)
            {
                SetForegroundWindow(intPtr);
            }
            Shutdown();
        }
    }
    [DllImport("User32", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindowW(string ClassName, string WindowName);
    [DllImport("User32", CharSet = CharSet.Unicode)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
}
  • 启动参数同样是在OnStartup函数中设置string[] args = e.Args;
  • 异常处理
//在程序级别捕获
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    DispatcherUnhandledException += App_DispatcherUnhandledException;
}

private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;//异常已经处理
}
//在主窗口级别捕获,这样可以在程序级别重新启动主窗口
public MainWindow()
{
    InitializeComponent();
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show("dd");
}
//异常首先被程序级别捕获再传到窗口级别,如果在程序级别中不设置e.Handled = true;则会传到窗口级别,然后主程序挂掉。
//所以在主程序挂掉之前要重启

Label

TextBlock合理Label相比,更加轻量化,Lable常用在可以连接到指定地方,加下划线。

Image

img.Source = new ImageSourceConverter().ConvertFromString("path.png") as ImageSource;这种方式需要设置图片不能为资源
img.Source = new BitmapImage(new Uri("path.png", UriKind.RelativeOrAbsolute));

对DataGrid数据进行排序

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);//获得默认视图
 if (cvs!=null && cvs.CanSort)
 {
     cvs.SortDescriptions.Clear();
     cvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Descending));
 }

对DataGrid数据进行分组

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
 if (cvs!=null && cvs.CanGroup)
 {
     cvs.GroupDescriptions.Clear();
     cvs.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
 }

对DataGrid数据进行筛选

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
 if (cvs!=null && cvs.CanFilter)
 {
     cvs.Filter = (obj) =>
     {
         if (obj is Person per)
         {
             return per.FirstName.Contans("TOM");
         }
         return false;
     };
 }

使用行为来扩展控件的功能

  1. nuget安装System.Windows.Interactivity.WPF
public class GrowTextBehavior:Behavior<TextBlock>
{
   public int Size { get; set; }
   protected override void OnAttached()//增加事件
   {
       base.OnAttached();
       AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
       AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
   }
   protected override void OnDetaching()//减少事件
   {
       base.OnDetaching();

       AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
       AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
   }
   //缩小
   private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
   {
       AssociatedObject.FontSize -= Size;
   }
   //放大
   private void AssociatedObject_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
   {
       AssociatedObject.FontSize += Size;
   }
}

  1. XAML
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<StackPanel VerticalAlignment="Center">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="HHHH">
        <i:Interaction.Behaviors>
            <local:GrowTextBehavior Size="10"/>
        </i:Interaction.Behaviors>
    </TextBlock>
</StackPanel>

在这里插入图片描述

使用DLL中的资源

Source="/LibraryName;component/Images/img.jpg"
在代码中访问Application.GetRemoteStream(new Uri("/MyLib;component/Img/R-C.png", UriKind.RelativeOrAbsolute));

资源管理

在Application.Resources中合并其他资源字典

使用系统的颜色和字体

{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}

其他线程更新UI

//下划线忽略不使用的变量
ThreadPool.QueueUserWorkItem(_ =>
{
    //其他现成更新UI
    Dispatcher.BeginInvoke(new Action(()=> {
        this.btn.Content = "aa";
    }));
});

BackgroundWorker组件

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;//支持取消
worker.DoWork += Worker_DoWork;//执行的任务事件
worker.RunWorkerCompleted += Worker_RunWorkerCompleted;// 执行的任务完成事件
worker.RunWorkerAsync(new Tuple<int, int>(1, 2));
worker.WorkerReportsProgress = true;//设置进度可用
worker.ProgressChanged += Worker_ProgressChanged;//计算进度更新
worker.CancelAsync();//取消

定时更新界面

DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(1.0);
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Start();

WPF中放入Winform控件

加入引用WindowsFormsIntegration和System.Windows.Forms
xaml中

<WindowsFormsHost>
            <forms:PropertyGrid x:Name="proForms"/>
</WindowsFormsHost>

proForms.SelectedObject = txtWPF;

Winform中放入WPF控件

直接拖控件

WPF如何将DLL嵌入到exe文件中

1)使用第三方库的WPF应用程序
2)修改项目文件

<Target Name="AfterResolveReferences">
    <ItemGroup>
      <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
        <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
      </EmbeddedResource>
    </ItemGroup>
</Target>

3)修改App.Xaml.cs

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
    {
        Assembly executingAssembly = Assembly.GetExecutingAssembly();
        var executingAssemblyName = executingAssembly.GetName();
        var resName = executingAssemblyName.Name + ".resources";

        AssemblyName assemblyName = new AssemblyName(args.Name); string path = "";
        if (resName == assemblyName.Name)
        {
            path = executingAssemblyName.Name + ".g.resources"; ;
        }
        else
        {
            path = assemblyName.Name + ".dll";
            if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
            {
                path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
            }
        }

        using (Stream stream = executingAssembly.GetManifestResourceStream(path))
        {
            if (stream == null)
                return null;

            byte[] assemblyRawBytes = new byte[stream.Length];
            stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
            return Assembly.Load(assemblyRawBytes);
        }
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
    }

C#调用win32API参考网站
http://www.pinvoke.net

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【我的渲染技术进阶之旅】你知道数字图像处理的标准图上的女孩子是谁吗?背后的故事你了解吗?为啥这张名为Lenna的图会成为数字图像处理的标准图呢?

文章目录一、先来看一张神图&#xff1a;Lenna图二、图片中的妹子是谁&#xff1f;三、为何要使用Lenna图像&#xff1f;四、谁制作了Lenna图像&#xff1f;五、人红是非多六、福利时间七、岁月神偷文末有福利 一、先来看一张神图&#xff1a;Lenna图 想必所有搞过图像处理的人…

LQ0265 汉诺塔【水题】

题目来源&#xff1a;蓝桥杯2012初赛 Java A组C题 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三…

Map和Set常见操作汇总

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 Map 介绍 什么是Map&#xff1f; Map.Entry,> 常用方法 代码 Map中的注意点总结 Set 常见方法汇总 Set中的注意点总结 Map …

Ngxin--源码分析 缓冲区链表

1.基本数据结构 在处理 TCP/HTTP 请求时会经常创建多个缓冲区来存放数据&#xff0c; Nginx缓冲区块简单地组织一个单向链表struct ngx_chain_s {ngx_buf_t *buf;ngx_chain_t *next; };buf: 缓冲区指针 next 下一个链表节点 注意&#xff1a; ngx_chain_t是…

自定义数据类型:结构体、枚举、联合

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐练习1练习2&#xff08;结构体嵌套问题&#x…

JSP表达式(EL)

一、介绍&#xff1a; EL&#xff08;Expression Language&#xff09;可用来代替JSP中的各类脚本&#xff0c;提高编程的灵活度&#xff0c;简化代码的编写。 二、EL的限制&#xff1a; 不能声明变量&#xff0c;需要使用JSTL或者JavaBean Action设置变量。 三、EL的标准格…

使用D435i+Avia跑Fast-LIVO

前言 最近Fast-LIVO开源了&#xff0c;之前看它的论文的时候发现效果很优秀&#xff0c;于是用实验室现有的设备尝试一下。这里主要记录一下使用不带外触发功能的D435i Avia跑Fast-LIVO的过程&#xff0c;为了适配代码&#xff0c;主要修改了雷达的驱动、相机的launch文件、以…

【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

文章目录一 Flink 中的 Window1 Window&#xff08;1&#xff09;Window概述&#xff08;2&#xff09; Window类型a 滚动窗口&#xff08;Tumbling Windows&#xff09;b 滑动窗口&#xff08;Sliding Windows&#xff09;c 会话窗口&#xff08;Session Windows&#xff09;2…

ATJ2157内存篇【炬芯音频芯片】---sct语法

ATJ2157 sct语法公共知识篇BNF 简介Sct脚本Sct的作用Sct的语法规则1. 加载域描述(Loadd region descriptions)2. 执行域描述3. 输入节的描述ATJ2157平台使用的sctRO的等效写法ScatterAssert()函数LoadLength()函数LoadBase()函数ImageLimit()函数ATJ2157平台什么数据编译出来是…

CentOS 7.6上安装SqlServer2017

一、 安装 SQL Server 1、 安装 SQL Server 所需的python2 sudo alternatives --config python # If not configured, install python2 and openssl10 using the following commands: sudo yum install python2 sudo yum install compat-openssl10 # Configure python2 a…

Python自动化小技巧12——根据论文题目自动导出参考文献格式

案例背景 在写论文的时候&#xff0c;弄参考文献格式也很麻烦&#xff0c;不可能手打人名题目期刊名称年月日卷号页码这些&#xff0c;我们一般都是使用系统自动导出的格式复制粘贴就行。中国知网可以直接导出论文的格式&#xff0c;但是知网基本只有中文的论文&#xff0c;英…

pdf编辑器工具哪个好?好用的pdf编辑器一款就够!

pdf这类办公软件大家都很熟悉&#xff0c;不过pdf通常情况只能看不能编辑&#xff0c;这着实也很让人苦恼&#xff01;特别是现在国内大多都已居家办公&#xff0c;本来就颇多不便&#xff0c;如果没有一款好用的pdf编辑器工具&#xff0c;那么势必导致工作效率更为低下。 那么…

第十二章 哈希表与字符串哈希

第十二章 哈希表与字符串哈希一、哈希表1、什么是哈希表2、算法逻辑&#xff08;1&#xff09;哈希函数&#xff08;2&#xff09;冲突解决3、算法模板二、字符串哈希1、算法逻辑2、算法用途3、算法模板一、哈希表 1、什么是哈希表 在之前的文章中&#xff0c;我们学习过离散…

Spring-aop技术

前言 spring-aop技术是对oop(面向对象)的一个补充&#xff0c;其底层其实就是使用aspect动态代理进行实现的&#xff0c;本篇文章将大概讨论下aop的核心实现流程 相关的核心概念 刚开始&#xff0c;先介绍下aop中比较核心的一些对象和概念&#xff0c;只要理解了这些&#xff…

【通信】粒子群算法5G物联网云网络优化【含Matlab源码 2160期】

⛄一、简介 1 引言 5G技术被大众所熟知之后&#xff0c;边缘计算也成了各行业关注的重点。最初的边缘计算概念是在2014年提出&#xff0c;到了2016年就拓展到了接入边缘&#xff0c;目前基本被定义为靠近用户边缘的、包含多种技术的接入网络&#xff0c;能够提供比较稳定的IT业…

精华推荐 | 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能优化实战篇」

Linux系统&#xff1a;Centos 7 x64Nginx版本&#xff1a;1.11.5 Nginx 是一款面向性能设计的 HTTP 服务器&#xff0c;能反向代理 HTTP&#xff0c;HTTPS 和邮件相关(SMTP&#xff0c;POP3&#xff0c;IMAP)的协议链接。并且提供了负载均衡以及 HTTP 缓存。它的设计充分使用异…

拼搏一周!刷了1000道Java高频面试题喜提阿里offer,定级P7

今年较往年相比面试要难的多&#xff0c;大环境也是对于程序员的要求越来越高&#xff0c;环境是我们无法改变的&#xff0c;我们能改变的只有自己&#xff0c;月初我一好友&#xff0c;努力拼搏一周&#xff0c;刷完了这份阿里P8大牛整理的这1000道Java高频面试题笔记&#xf…

GitHub配置SSH Keys步骤

Git配置SSH Keys步骤 许多 Git 服务器都使用 SSH 公钥进行认证。 为了向 Git 服务器提供 SSH 公钥&#xff0c;如果某系统用户尚未拥有密钥&#xff0c;必须事先为其生成一份。 生成步骤如下&#xff1a; 1. 设置用户名和邮箱 在git命令行中对git进行全局设置 git config --…

八、CANdelaStudio入门-Session

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Session概念,欢迎各位朋友订阅、评论,…

微信小程序:用户基本信息的采集

写作背景 在开发商城小程序时需要显示用户头像、昵称、手机号等信息以便后续业务的实现&#xff0c;因此需要通过微信小程序的API采集用户数据&#xff0c;由此进行总结。 在微信小程序中获取用户信息可以通过这几种方式获取&#xff0c;getUserInfo、getUserProfile、open-da…