1.新建一个WPF的应用;

2.拖拽控件并布局好:

【小技巧】选中控件,点击”回形针“即可让该控件跟随窗口自动调整大小;

3.编写代码:

主程序代码如下:

namespace WpfApp1
{
delegate void ShowMsgDelegate(ref TextBox textbox1, string msg);//定义委托类型
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
ShowMsgDelegate showMsgDelegate = null;//定义委托变量
public MainWindow()
{
InitializeComponent();
TextBox1.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
this.MyButton1.Click += ButtonClicked;//button1是手动代码挂接事件,Button2是IDE双击自动挂接,效果相同 showMsgDelegate += ShowMsg;//关联委托
} LogSave logSave1 = new LogSave();
private void ButtonClicked(object sender, RoutedEventArgs e)
{
if (sender == this.MyButton1)
{
string msg1 = $"{MyButton1.Name}按钮被按下"+"\r\n";
this.MyTextBox.Text = msg1;
logSave1.AddMsg(msg1);
showMsgDelegate.Invoke(ref TextBox1, msg1);
}
else if (sender == this.MyButton2)
{
string msg1 = $"{MyButton2.Name}按钮被按下" + "\r\n";
this.MyTextBox.Text = msg1;
logSave1.AddMsg(msg1);
showMsgDelegate.Invoke(ref TextBox1, msg1);
}
else if (sender == this.MyButton3)
{
TextBox1.Clear();
}
}
public void ShowMsg(ref TextBox textbox1, string msg)
{
string timestring = DateTime.Now.ToString();
msg = timestring + "|" + msg;
textbox1.Text=textbox1.Text.Insert(0, msg);
} }
}

log记录的代码:

namespace WpfApp1
{
class LogSave
{
FileStream LogFile;
string str_date; //log文件日期
List<string> str_list = new List<string>();
public void AddMsg(string MsgStr)
{
byte[] byData; if (LogFile == null || 0 != string.Compare(str_date, DateTime.Now.ToString("yyyy-MM-dd")))
{
String str;
str = Path.GetFullPath("..") + "\\log\\";
if (!Directory.Exists(str))
{
//文件夹不存在则创建
Directory.CreateDirectory(str);
}
try
{
if (LogFile != null)
{
LogFile.Close();
LogFile = null;
}
str += DateTime.Now.ToString("yyyy-MM-dd") + ".log";
if (!File.Exists(str))
{
LogFile = new FileStream(str, FileMode.Create);
}
else
{
LogFile = new FileStream(str, FileMode.Open); }
str_date = DateTime.Now.ToString("yyyy-MM-dd");
}
catch (Exception)
{
return;
}
}
if (LogFile != null)
{
string StrTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
MsgStr = $"<{StrTime}>>{MsgStr}\n";//加入log //MsgStr = MsgStr + Environment.NewLine;//分行
byData = System.Text.Encoding.Default.GetBytes(MsgStr);//设置格式
if (LogFile.CanWrite) LogFile.Write(byData, 0, byData.Length);
str_list.Add(MsgStr);
LogFile.Seek(0, SeekOrigin.End);//在第一行打印
}
}
}
}

项目:

最终运行效果:

【小技巧】让最新的log消息显示在首行;

C#-WPF初学的更多相关文章

  1. WPF初学(一)——布局【良好界面的基础】

    由Winform转到WPF的一部分人,很可能忽略掉布局,习惯性的使用固定定位.然而,没有良好的布局,后面界面控件画的再好看,花哨,都不过是鲜花插在牛粪上,很可能始终都是一坨??(呵呵). 闲话少说,首 ...

  2. WPF 初学VisifireChart

    visifire今天登陆他们官网的时候,发现好像是挂掉了,不知道是不再运营了,还是单纯服务器出了问题. VisifireChart的效果不炫,但是对于一些项目,感觉够用的,所以,今天大概看了几篇博客, ...

  3. WinForm数字小键盘/WPF数字小键盘

    模仿原本的WinForm触摸屏小键盘制作WPF触摸屏小键盘 原WinForm触摸屏小键盘样式(WinForm采用Krypton系列控件)如下图: Designer代码如下: // // BtnNum1 ...

  4. WPF datagrid 初学

    <Window x:Class="WpfDemo.WinDataGrid" xmlns="http://schemas.microsoft.com/winfx/20 ...

  5. [初学WPF]控件大小自适应

    想在Win上自己写点小工具用,GUI自然是免不了的,于是决定学一学WPF,直接拖控件是很方便啊.控件拖出来以后发现运行时改变窗口大小控件不会重绘,搜索了一下发现了解决办法:使用Viewbox控件. V ...

  6. (初学)wpf仿QQ界面-整体布局

    跟一个小学弟一起学习wpf,小学弟是刚初中毕业,对编程刚刚接触,我挺怕自己带的不好,影响小学弟以后在编程方向的学习兴趣.我承认自己水平不高,但是在努力去学习新知识!一起加油吧!在此以博客,记录学习进度 ...

  7. WPF 我的初学必备技能

    0.控件 0.1.内容控件(Content Controls) 0.2.条目控件(Items Controls) 0.3.文本控件(Text Controls) 0.4.范围控件(Range Cont ...

  8. [开发笔记]-初学WPF之自学笔记

    一:动态加载背景图片 代码: 在窗体加载时,Window_Loaded 方法中: #region 测试动态加载背景图片 /* 1.图片右键 属性: 复制到输出目录:选择“如果较新则复制” 生成操作选择 ...

  9. WPF 变量绑定实现

    最近初学WPF,遇到如控件的内容是动态生成的.这时候就需要变量绑定. 简单写下变量绑定的步骤. 如下面的 例子,TextBlock 的内容是动态的,绑定变量StuName. <TextBlock ...

  10. WPF之Binding初探

    初学wpf,经常被Binding搞晕,以下记录写Binding的基础. 首先,盗用张图.这图形象的说明了Binding的机理. 对于Binding,意思是数据绑定,基本用法是: 1.在xmal中使用 ...

随机推荐

  1. 5GC 关键技术之 SBA(基于服务的软件架构)

    目录 文章目录 目录 前文列表 5GC 的关键技术 SBA(基于服务的软件架构) 微服务架构 NF 的模块化 NF Service 的服务化 前文列表 <简述移动通信网络的演进之路> &l ...

  2. 4G EPS 中的小区搜索

    目录 文章目录 目录 前文列表 小区搜索(Cell Search)流程 PSS(主同步信号)与 SSS(辅同步信号) DL-RS(下行参考信号) PBCH(物理广播信道) PDSCH(物理下行共享信道 ...

  3. angular自定义属性指令

    在angular中有三种类型的指令: 组件–拥有模板的指令: 结构性指令–通过添加和移除DOM元素改变DOM布局的指令; 属性型指令–改变元素.组件或其他指令的外观和行为的指令: 组件是这三种指令中最 ...

  4. 基于Python的性能分析

    1.什么是性能分析 字面意思就是对程序的性能,从用户角度出发就是运行的速度,占用的内存. 通过对以上情况的分析,来决定程序的哪部份能被优化.提高程序的速度以及内存的使用效率. 首先我们要弄清楚造成时间 ...

  5. linux文件的三个时间,修改文件时间为任意时间

    目录 一.文件的三个时间 二.修改文件的三种时间为任意时间 一.文件的三个时间 当我们在linux中创建了文件或文件夹,文件/文件夹就有了时间属性,而且linux中的文件具有三个时间,可以通过stat ...

  6. 牛逼:一张900w的数据表,17s执行的SQL优化到300ms?

    转载自   https://mp.weixin.qq.com/s/ru_B1aI0YrpXeSl-J01sHQ

  7. WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

    在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None".AllowsTransparency="True" 这两个 ...

  8. switch case 跳转表

    一.事情来源 事情来源是一段奇怪的代码,代码如下 int x = 1000; switch (x) { case 1000: { NSLog(@"%d", 1); } case 2 ...

  9. SpringBoot系列(一)简介。

    概述: Spring Boot 可以简化spring的开发,可以快速创建独立的.产品级的应用程序. 特征: 快速创建独立的 Spring 应用程序 直接嵌入了Tomcat.Jetty或Undertow ...

  10. 《Android开发卷——自定义日期选择器(一)》

    (小米手机) (中兴手机) 在实际开发中,Google官方提供的时间选择器API已经不能满足于我们的需要了,所以很多公司都是采用自定义的形式来实现日期选择器. 这个例子很简单,定义三个NumberPi ...