第二天:2017-09-11

1、每次代码更新,最好都进行“重新生成解决方案: clt + b + b” 。不然就像我一样被坑了半个小时


2、有什么快捷键导致选中的代码全部变成小写。

  • 改成小写:Ctrl+U

  • 改成大写:Ctrl+Shift+U

由于这和注释的快捷键很相似(Ctrl + K + U)。误操作,结果被坑了半个小时。所以以后想办法避免:

Top Tool Bar -> 工具 -> 选项 -> 键盘 -> 显示命令行中输入 “小写” -> 选中“编辑.转换为小写” -> 移除快捷键


3、C# 做单元测试就是这么简单

新建一个单元测试项目打开源代码文件UnitTest1.cs,输入以下代码

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            int a = 100;
            int b = 200;
            Console.WriteLine("123");
            Assert.AreEqual(b - a, 100);
        }
    }
}

接下来就是重点了。Top Tool Bar -> 测试 -> 窗口 -> 测试资源管理器右键我们第一个测试方法: TestMethod1

稍等一会就能看到成功的信息:

那我们的 Console.WriteLine 输出的信息在哪里?

我们点击上图的 “输出” 链接就可以看到了


4、难以忍受的文件夹目录

在项目目录中,由于单元测试项目的引用依赖,会自动生成一个packages文件夹。显得格格不入。身为简洁的程序员我绝对不能忍。首先将 packages 剪切进 单元测试项目的文件夹,这里我是 TestApp 文件夹

并且打开单元测试项目下的 .csproj 文件。搜索所有关于 ..\packages 路径的代码, 全部替换为 .\packages 保存即可。

重新生成并且运行单元测试。一切正常。但发现那个讨厌的 packages 文件夹又出现在不该出现的位置。这是由于项目下

packages.config 文件导致的,每次重新编译生成时就会体贴的自动生成,但是我们的项目已经有引用了。所以已经不需要了。

所以,最后一句就是将 packages.config 文件删除。


5、WindowForm 每次都需要手动重新生成? 这也太麻烦了吧

解决方案:Top ToolBar -> 生成 -> 配置管理器 -> 生成全部勾选(√)


6、webBrowser的使用

入门: 从工具箱中拖一个 webBrowser 入界面。然后就可以来测试了。

private void button12_Click(object sender, EventArgs e)
{
    try {
        this.webBrowser1.Url = new Uri(this.textBox11.Text);
    } catch (Exception ex) {
        MessageBox.Show("URL格式有问题,请确保不为空并且包含 http:// 或者 https:// \r\n\r\n" + ex.Message);
    }
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserNavigatedEventArgs e)
{
    // 显示转换
    WebBrowser wb = (WebBrowser)sender;
    MessageBox.Show("加载完毕");
    MessageBox.Show(wb.DocumentTitle);
    MessageBox.Show(wb.DocumentText);
}

进阶: 脱离了控件,通过代码创建WebBrowser并且绑定事件

private void button12_Click(object sender, EventArgs e)
{
    try {
        WebBrowser wb = new WebBrowser();
        wb.Url = new Uri(this.textBox11.Text);
        wb.Navigated += webBrowser1_Navigated;
    } catch (Exception ex) {
        MessageBox.Show("URL格式有问题,请确保不为空并且包含 http:// 或者 https:// \r\n\r\n" + ex.Message);
    }
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserNavigatedEventArgs e)
{
    // 显示转换
    WebBrowser wb = (WebBrowser)sender;
    MessageBox.Show("加载完毕");
    MessageBox.Show(wb.DocumentTitle);
    MessageBox.Show(wb.DocumentText);
}

知识点:

  • webBrowser1_DocumentCompleted 是 页面加载完成事件

  • 绑定事件是用 += ,何况编辑器也会智能提示你这样做啦。

  • object sender 就是我们通过代码创建的WebBrowser,虽然我知道,但我就是用不了,通过看别人的博客和代码,才知道这里需要显示转换(WebBrowser)类型。


7、圣战:大括号打死不换行!!!

工具 → 选项 → 文本编辑器 → C# --> 代码样式 --> 格式设置 --> 新行 --> 全部取消勾选

(PS:推荐保留类和方法,视觉而言代码的层次感鲜明,有利于提高代码可读性)


8、lambda表达式函数 + 函数作为参数传递 + Action<T> 与 Func<T>

Action<T>:lambda函数必须没有返回值

static void Main(string[] args)
{
    int aa = TestLambda(fuck => {
        Console.WriteLine(fuck);
    });
    Console.Write(aa);
    Console.ReadLine();
}

public static int TestLambda(Action<string> action)
{
    action("fuck");
    return 123;
}

Func<T>:lambda函数必须具有返回值,且返回的值必须符合Func定义的最后一个参数的类型(在demo中是int类型,于是我返回1234)。

static void Main(string[] args)
{
    int aa = TestLambda(str => {
       Console.WriteLine(str);
       return 1234;
    });
    Console.Write(aa);
    Console.ReadLine();
}

public static int TestLambda(Func<string, int> action)
{
   // 调用这个函数,并且传递一个值
   return action("Hello World");
}

9、如何在 WebBrowser 中截图

入门:手动添加webBrowser控件并且手动绑定DocumentCompleted事件来实验。

// 点击的时候加载页面
private void button_Click(object sender, EventArgs e)
{
    this.webBrowser1.Url = new Uri("http://www.baidu.com");
}

// 加载页面完毕后触发,因为必须等页面加载完毕后截图才有意义
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    int width = 322;
    int height = 411;
    Bitmap bitmap = new Bitmap(width, height);
    Rectangle rectangle = new Rectangle(0, 0, width, height);
    this.webBrowser1.DrawToBitmap(bitmap, rectangle);

    // 保存图片对话框
    // SaveFileDialog saveFileDialog = new SaveFileDialog();
    // saveFileDialog.Filter = "JPEG (*.jpg)|*.jpg|PNG (*.png)|*.png";
    // saveFileDialog.ShowDialog();
    // Console.WriteLine(saveFileDialog.FileName);
    // bitmap.Save(saveFileDialog.FileName);

    bitmap.Save("c:\\123.jpg");
}

进阶:通过代码生成 WebBrowser 实例 并且 通过代码绑定 DocumentCompleted 事件,事件的函数也直接使用lambda表达式函数来快速编写。

/// <summary>
/// 截取WebBrowser网页中的图片
/// </summary>
/// <param name="webBrowser">WebBrowser实例对象</param>
/// <param name="width">宽</param>
/// <param name="height">高</param>
public static void CutPic(WebBrowser w, int width = 322, int height = 411)
{
    Bitmap bitmap = new Bitmap(width, height);
    Rectangle rectangle = new Rectangle(0, 0, width, height);
    w.DocumentCompleted += (sender, e) => {
        // 必须等页面加载完毕后截图才有意义
        w.DrawToBitmap(bitmap, rectangle);
        // 保存图片
        bitmap.Save("c:\\123.jpg");
    };
}

private void button_Click(object sender, EventArgs e)
{
    // 知识点:属性可以通过这种方式赋值
    WebBrowser wb = new WebBrowser {
        Url = new Uri("http://www.baidu,com");
    };
    CutPic(wb);
}

results matching ""

    No results matching ""