学习笔记
铁樵
搬砖工人
展开
-
UWP应用的标题修改
UWP应用的标题修改原创 2023-02-19 19:39:36 · 307 阅读 · 1 评论 -
MySQL其实是支持嵌套查询的
MySQL嵌套查询原创 2023-02-02 23:05:42 · 441 阅读 · 0 评论 -
C# DataTable在指定位置插入列
如果有一个DataTable已经有了数据,可以通过 DataTable.Columns.Add(new DataColumn("NewCol0", typeof(string))) 来添加新的列,但是如果要把新的列添加到指定位置应该如何操作呢,DataTable没有InsertAt()操作,但是可以通过DataColumn的SetSetOrdinal()来实现。转载 2022-12-12 10:42:01 · 4529 阅读 · 0 评论 -
UWP中的ListView, GridView, TreeView性能注意点
UWP中ListView, TreeView和GridView的性能提高转载 2022-08-19 12:13:37 · 267 阅读 · 0 评论 -
UWP DataGrid排序
我们在winform中经常用到DataGridView,好像是自带排序功能的(点击对应列的表头会自动排序)。在UWP的DataGrid中不能自动排序,不过实现起来也不复杂,网上例程不多,但是我在微软MSDN上找到了非常详细的说明和例程。1. DataGrid有一个自带的Sorting时间,在Xmal中为其添加对应的事件函数<controls:DataGrid x:Name="dg" Height="600" Margin="12" AutoGenerateColum转载 2022-03-19 10:16:36 · 234 阅读 · 0 评论 -
UWP在多线程中更新UI
我们在编程的时候,经常思路是比较直接的,一开始会经常在线程里面去更新界面上元素,然后VS就给我们报错 “不能修改由其他线程创建的对象”。在WPF中,我们会简单地通过调用dispatch的方式在线程中更新UIApplication.Current.Dispatcher.Invoke(()=>{ //update UI code });在UWP中,其实也很简单,只需要多一个函数设置即可。//在MainPage的后台code里面添加这个申明public async vo转载 2022-03-19 10:06:57 · 831 阅读 · 0 评论 -
UWP在子页面中调用主页面的函数
有时候我们需要在UWP的主页面中调用子页面的函数或者属性,下面是一个例子。//Function in main pagepublic void SetText(String text){ this.txtPageNow.Text = text;}//sub page to call function defined in main page((Window.Current.Content as Frame).Content as MainPage).SetText("your te.转载 2022-03-15 16:02:25 · 215 阅读 · 0 评论 -
C# 返回泛型的函数
我们都知道C#有泛型,就是类似于List<T> 这样的数据类型,这个用起来非常方便,而且他们也是强类型的,在编程的时候VS可以给足够的编译提示。有时候我们还需要做一些通用的函数,这些函数的返回值类型在调用的时候指定。下面是一个简单的例子:我们需要一个类型转换函数,传入object对象,然后根据指定的类型转化它。这个时候返回值类型是在调用的时候才知道的。写法如下。这只是一个简单的例子,介绍了泛型返回值函数的格式。private T ConvertObject<T>(o原创 2022-02-10 17:28:06 · 3208 阅读 · 0 评论 -
C# async await 和 IProgress 实现异步耗时操作并更新进度
C# 5.0以后异步编程(线程)变得非常简单而直观,写起来基本就跟顺序编程差不多,逻辑清晰很多。不过我们这些从C#3.0或者更早版本过来的老猿对这些新事物还是有些不适应的,这里给一个简单的示例,演示如何利用async, await实现异步耗时操作,并且通过IProgress实现进度返回并更新UI。程序非常简单,界面上有一个Button和一个TextBox, 其中TextBox用来显示进度 //更新界面的函数 private void ReportProgress(in原创 2021-11-20 19:24:20 · 2107 阅读 · 0 评论 -
UWP Segoe Icon组合
UWP和WPF中微软提供了很多Icon, 只需要选择Segoe MDL2 Assets字体,然后使用对应的代码即可。这种Icon的好处就是,它是矢量图形,可以通过FontSize设置大小,字体放大之后Icon还是非常清除,没有失真。微软官方提示我们可以把多个Icon叠在一起组合使用,创建出我们需要的组合Icon。但是在Xmal中如何组合呢?网络上找不到什么实例,我自己摸索出来,用Grid即可,而且非常方便。下面我们来在Xmal里面实现一下组合Icon,效果图如下。对应 Xmal如下,不.原创 2021-11-03 22:02:51 · 366 阅读 · 0 评论 -
UWP保存图片时颜色反相【已解决】
从网上找的代码,把UWP的Xaml的UIElement截图保存到剪贴板中,但是发现颜色都反了。代码和截图如下。具体原因是由于 BitmapPixelFormat.Rgba8引起的,换成 BitmapPixelFormat.Bgra8 之后就好了。 //RenderTargetBitmap to render UIElement to image byte data array RenderTargetBitmap renderTargetBitmap原创 2021-10-25 21:27:24 · 266 阅读 · 0 评论 -
UWP保存截图到剪贴板
上一篇讲了怎么样把UWP的UIElement截图保存到文件,这一篇再介绍一下如果把UIElement截图复制到剪贴板。其实操作类似,只是保存文件需要FileSavePicker创建文件Stream, 而写入剪贴板我们需要创建MemoryStream,把数据转换后放在内存中,然后用DataPackage把图像数据复制到剪贴板。直接看下面代码吧 //use RenderTargetBitmap to render UIElement to image byte data arra原创 2021-10-25 21:15:01 · 256 阅读 · 0 评论 -
UWP文字旋转的锚点 RenderTransformOrigin
在UWP中文字旋转不能再用LayoutTranform了,只能用RenderTransform。在文字旋转过程中,我们会问旋转的锚点在哪里,是在文字的中心,还是文字的左上角呢?这个其实是通过TextBlock的RenderTransformOrigin属性控制的,它的值是两个比率,表明锚点在文字的X,Y方向的什么地方。RenderTransformOrigin=“0,0” 代表旋转锚点在文字的左上角,RenderTransformOrigin=“0.5,0.5”表示旋转的锚点在文字的中心。看下面的例子就比较原创 2021-10-19 19:47:43 · 530 阅读 · 0 评论 -
UWP DataGrid滚动事件和滚动距离(Scroll Offset)
有需要需要给UWP的DataGrid添加滚动事件,并在滚动事件中获取滚动距离(Scroll Offset)。 DataGrid中完全找不到对应的事件和属性, Bing了之后还是在StakeOverflow找到了解决方法,下面是相关代码,通过一个函数找到DependencyObject的ScrollBar对象,然后给它添加ValueChanged的事件,在事件中通过e.NewValue获取滚动距离。我对于DependencyObject和DependencyProperties还不了解,这里代码贴出来给需转载 2021-09-30 08:40:47 · 322 阅读 · 0 评论 -
UWP DataGrid重复绑定和效率提升 [ScrollViewer耗内存]
我们为了让DataGrid在后台数据更新之后自动刷新显示,一般都用ObservableCollection<T>作为数据源。这个在数据量小的时候没有什么问题,如果数据量大的时候对性能会有影响,因为每次在向ObservableCollection插入数据的时候,都要更新UI。我做了一个实验,向ObservableCollection中添加5000行数据,到DataGrid加载数据完毕,总共用了1s。有时候为了效率,我们更倾向于使用类似于.Net Framework里面的绑定方式,不需要自动更新原创 2021-09-28 11:56:21 · 301 阅读 · 0 评论 -
UWP StorageFile二进制读取 [Stream]
前面有一篇讲过通过FilePicker让用户选择文件,然后通过StorageFile.OpenStreamForReadAsync() 和 StorageFile.OpenStreamForWriteAsync()返回StreamReader/StreamWritter来读写文文件。https://blog.csdn.net/alai7150/article/details/120036249?spm=1001.2014.3001.5501但是这个方法只能是文本读写(ASCII),如果我们要二进制读原创 2021-09-07 12:20:03 · 471 阅读 · 0 评论 -
UWP DataGrid后台创建Column和绑定
DataGrid是一个好东西,绑定数据非常简单,而且数据显示的也非常完美。一般一开始学习的时候都是在XMAL里面设定好列与数据绑定的。但是很多时候我们需要在后台动态创建列,并为列绑定我们需要数据。这里我就给个例子,大家看一下。例子稍微有点复杂,加入了复杂属性绑定的演示。其实动态创建列的绑定主要就是要知道用 Binding.PropertyPath 来设置。dgtc.Binding = new Binding() { Path = new PropertyPath("cName") };<原创 2021-09-06 12:24:22 · 427 阅读 · 0 评论 -
UWP VisualState AdaptiveTrigger不触发
我们有时候需要用到VisualState的Adaptive Trigger来实现UWP控件和window的自适应。但是新手会遇到Adaptive Trigger有时候能行,有时候不行。这里有一个陷阱,就是VisualStateManager必须是Page里面的第一个控件。-------------------------- 以下来自转载内容 ---------------------------我想尝试AdaptiveTrigger,但我的最小Windows 10 UWP应用程序无法启动。&l转载 2021-09-06 12:05:52 · 169 阅读 · 0 评论 -
UWP DataGrid绑定复杂对象
在UWP中基本上看不到DataTable的使用, 所以一般DataGrid绑定的都是对象的列表。下面是一个比较简单的绑定代码。XAML: <controls:DataGrid Name="SecondGrid" ItemsSource="{Binding Persons}" AutoGenerateColumns="False" Grid.Row="2"> <controls:DataGrid.Columns>原创 2021-09-05 19:01:34 · 279 阅读 · 0 评论 -
C# 对象定义时初始化
C#中没有像VB with一样的语句,但是我们在定义对象的时候还是可以直接初始化的,类似于VB的with语句。//对象初始化赋值Person p = new Person(){Name="Ian", Age=16, City="LS"};//List初始化赋值List<string> l = new List<string>(){"Time", "Is", "Infinite"};//Dictionary 初始化赋值Dictionary<string, st原创 2021-09-01 18:41:37 · 1315 阅读 · 0 评论 -
UWP 读写文件 StreamReader/StreamWriter
UWP程序和Winform差异还是蛮大的,UWP毕竟是倾向于移动客户端Application开发,所以权限问题值得被画一下重点。在UWP中,app不能再随随便便访问客户端的文件系统,必须要通过获得用户的同意才可以。UWP的Desktop应用还是这样的,所以刚从Winform转过来UWP我确实很不适应。默认情况下UWP可以访问程序的安装目录(读写), 而且不需要用户授权。其他位置的文件读写都需要用户的授权。比如在用户电脑本地有个文件C:\temp\aa.txt, 你用System.IO.File.Exis原创 2021-09-01 11:52:32 · 844 阅读 · 1 评论 -
UWP FileOpenPicker 的使用注意点
从Winform迁移到UWP之后发现FileOpenDialog这个好用的控件不见了。查了Bing之后才知道在UWP中是用FileOpenPicker了。下面这个就是微软的示例代码,但是放到我们UWP的事件函数中会报错 ”await 只能用于异步方法中,请考虑使用async修饰方法”var picker = new Windows.Storage.Pickers.FileOpenPicker();picker.ViewMode = Windows.Storage.Pickers.PickerVi原创 2021-08-31 21:42:49 · 515 阅读 · 0 评论 -
C# StringBuilder解决字符串连接耗时问题
我们一般字符串连接用 “+”, 但是在数据量比较大的时候这个操作非常耗时。解决方法其实很简单,就是用StringBuilder代替“+"号连接。代码如下,自己实验效果。//一万行,每行1000此字符连接//加号连接,耗时操作for(int i=0;i<1000;i++){ string lineTxt=""; for(j=0;j<10000;j++) { lineTxt += "A"; } //sw.WriteLine(lin原创 2021-08-24 22:40:23 · 428 阅读 · 0 评论 -
UWP ToggleMenuFlyoutItem点击后不隐藏MenuFlyout
UWP中的MenuFlyout里面可以支持ToggleMenuFlyoutItem, 每次点击之后会选中或者取消选中状态,但是默认情况下,点击任何一个ToggleMenuFlyoutItem后,真个MenuFlyout会自动隐藏。如果我们想多选的话,没选择一个要重新打开MenuFlyout,特别麻烦。有时候我们想能不能在点选的时候MenuFlyout不自动隐藏,我们可以一次选中好几个ToggleMenuFlyoutItem。这个时候我们就需要处理一下MenuFlyout的Closing事件,在里面把a.原创 2021-08-17 18:06:51 · 361 阅读 · 0 评论 -
Linux c++服务程序Daemon最简单的实现方式
Linux上面的服务程序就是Daemon守护进程,这里不详情讲Daemon(其实我也不是很了解),这里只是介绍如何实现把C++程序转化为Daemon守护进程。其实将普通程序变成服务进程(启动后就不会在被关闭),主要是将普通程序变成一个类似于“孙悟空”(没有父程序)的程序,就不会因为父进程退出而退出。这里就用到fork的概念,这个我也不是很清楚,有兴趣的可以bing一下。其实c++中提供了一个daemon(int nochdir, int noclose)函数用来实现我们需要的功能,我们只需要在我们的原创 2021-07-25 19:56:33 · 830 阅读 · 0 评论 -
Linux程序自启动
Linux上面如果要设置某些程序随着操作系统启动而自动启动的方法有很多,这里我介绍两种方法(都来源于网络)。1. 在/etc/rc5.d/目录下建立一个启动脚本:Sxxxx脚本需要以“S”开头,代表STARTrc*.d, 这里面有很多rc0.d, rc1.d .... rc6.d 这些对应不同的启动权限,可以bing一下/usr/local/bin/service.exe重启电脑,重启之后通过ps -aux|grep 'service' 查看是否已经自动启动。注意:这里设置的自..原创 2021-07-25 19:43:19 · 1466 阅读 · 0 评论 -
Linux C++ sleep in ms
Linux C++ 中 sleep(s) 函数是按秒来计算的,如果想要sleep毫秒级,那就需要用到usleep(us),其中的参数是us 微秒。如果要休眠1ms,那就用usleep(1000) 就可以了。原创 2021-07-07 20:53:20 · 4049 阅读 · 0 评论 -
Linux eclipse C++连接选项设置
我们在Linux原创 2021-06-01 17:10:17 · 246 阅读 · 0 评论 -
VS在多工程解决方案中不能停在错误行[解决]
一般VS在调试的时候会自动停在出错的行,但是当我们解决方案中有多个工程时,有时候会由于VS设置的问题导致在子工程中无法自动停留在出错的行。这个设置如下:VisualStuido -> 工具-> 选项...原创 2021-04-26 22:03:42 · 266 阅读 · 0 评论 -
C# Reflection设置delegate/event, BackgroundWorkder跨类调用
C# 的Reflection非常有用,可以用它创作出更加通用,扩展性更好的程序(Reflection的效率会低一些)。Reflection用的最多的地方是在子程序的DLL有其他人开发的时候,主程序通过Reflection调用DLL的方法完成额外的任务。有时候主程序需要跟子程序DLL进行交互的时候,尤其是子程序耗时比较长的时候,我们需要反馈执行进度(异步执行),这个时候就需要用到Delegate来给子程序类绑定主程序的界面更新函数。相信大家对于通过Refelection的MethodInfo的Invo原创 2021-04-13 17:12:54 · 299 阅读 · 1 评论 -
C#类型后加问号 int?
偶然间发现C#类型还有一种特俗的操作,就是在类型后面加上问号。这种类型是可为空的类型。int? a=null; //可为空的int类型a=10;float? b=null;//可为空的float类型b=12.1f;double? c=null;//可为空的double类型c=100.059;//... ...//string 类型没有 string?的形式//如何使用呢?int age = a + 10;//这个会报错的//正确使用方法如下if(a != null )原创 2021-04-12 10:16:38 · 4862 阅读 · 3 评论 -
Linq to DataTable 滤除 DBNull
用Linq来查询DataTable是非常方便,效率也是很高的。下面是一个示例代码。 //Define a data table and top up data with null in Age Field DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string原创 2021-03-31 19:29:33 · 970 阅读 · 0 评论 -
C# 读取注册表失败
遇到奇怪现象,用RegEdit打开注册表可以看到键和值都有。但是用C# RegistryKey.GetValue()就是无法获取到值。当然注册表的权限已经全部设置好了。这个奇怪的问题,可以看一下是否在x64位电脑上编译成x86/AnyCPU的程序了,尝试编译成x64的程序应该就可以了。更多信息请访问下面的博文https://www.codeproject.com/Articles/51326/Net-Compilation-registry-accessing-and-applicatio.原创 2021-03-29 10:05:19 · 1447 阅读 · 0 评论 -
C#在初始化对象时类似与VB With的写法
用过VB的童鞋都知道VB中有With关键字,可以省略每次重复写对象名。C#中有没有呢?其实是有的,在C#中初始化对象时,是有类似的写法的,请参看下面的code。vb codedim u as new user;with user .id = 123456 .name = "Username" .password = "pwd"end withC# codeUser u = new User(){ id = 123456 .转载 2021-02-02 16:20:45 · 532 阅读 · 0 评论 -
转 - C# WinForm在高分辨率下界面模糊问题的解决
转自知乎前言昨天刚搞定了DevExpress,今天就遇到了之前遇到过的一个问题,那就是WinForm在高分辨率下界面模糊。我的开发环境是Windows10 64位和VS2010,电脑屏幕分辨率为1920*1080,采用的是WinForm程序设计方法开发。在程序运行时遇到了这样一个问题,在VS设计的很清晰的菜单和界面,运行的时候菜单和控件上字体变得很模糊,界面大小也发生了变化。于是上网寻求解决办法,网友给出的解决方案有以下3种。WinForm对高分屏的支持不好,用WPF程序设计可以解决该问题。(这转载 2021-01-20 10:02:31 · 1740 阅读 · 2 评论 -
WPF保存图片
其实在WPF中保存图片是非常容易的,并且可以指定把任何对象或者子对象。你指定的对象和他的所有内部内容都会被输出到图片。具体代码如下,其中“MainGrid"是一个Grid, 当然你可以指定任何XMAL中的对象,比如Canvas, Panel等等。string fileName = @"snap.bmp";System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create);RenderTa原创 2021-01-18 07:56:34 · 1059 阅读 · 0 评论 -
DataGridView动态加载部分数据防止卡顿[源码]
DataGridView是我们显示表格数据最常用的控件, 非常好用,功能强大。但是当数据量特别大时(不管是行还是列,行的影响会小一些,列的影响特别明显)直接绑定数据会占用很久的时间,并且不能响应用户的操作而造成卡顿。所以我们就需要用到动态加载,加载部分数据,当用户滚动到边界时再加载后面的一部分数据,我们控制每次加载的行或者列的数量来保证加载速度。我们以动态加载列为示例,下面示例建立了一个1000列的table,每次加载100列供当前DataGridView显示。我们已经尝试过创建10000列的table,用原创 2020-12-18 20:57:21 · 1685 阅读 · 1 评论 -
向DataRow动态添加很多Column时占用内存大且无法释放[解决]
现在我们有一个简单的需求,一个DataRow里面1万列(创建它的DataTable有1万列),我们要把它增加一列并为这个Cell更新一个数据。DataRow根本没有添加Column的的方法,我们自然而然会想到复制DataRow的方法。其实也可以一个cell一个cell地复制,但是我们发现可以通过DataRow的ItemArray一次性导入到新的DataRow。请参看下面代码,我们定义了一个10列的DataTable,然后在添加一行数据时,动态把DataTable扩展到10000列,由于我们一开始的D原创 2020-12-14 13:55:12 · 791 阅读 · 0 评论 -
Datatable当列非常多时更新数据耗时[解决方案]
Datatable是.net下一个非常好用的数据结构,一般情况下当列的数据量再1000以内的数量级,操作不需要考虑性能。这里为什么提到列,因为Datatable对行的处理非常好,如果列不是很多的时候,插入几万行乃至几十万行数据都是非常快速的。但是当列过多时,这里就有可能带来非常大的性能问题。现在我们建立了一个10000列的table,并添加了10行的数据,来试验一下不同的插入数据方式会带来怎样的性能影响。方法1:代码如下,这个一种非常好的方式,总共耗时0.104秒 //M原创 2020-12-14 12:19:06 · 2710 阅读 · 1 评论 -
C# Socket通信简单实例代码
Socket是网络编程必须要了解的一块,C#对Socket的封装还是蛮好的,用起来非常方便。下面是一个非常简单的实例代码。客户端 主要有下面几个关键点:1. 用Socket对象连接server, 连接成功后用Thread启动receive的轮询,如果接收到新的数据到达就解码然后更新。2. 如果有发送,直接调用Send()函数发送编码好的字符。 public partial class Form1 : Form { public Form1() {原创 2020-10-26 18:07:23 · 1123 阅读 · 1 评论