顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2017年1月14日 星期六

[WPF] 抓取網頁資料

Step 1: 工具 > NuGet封裝管理員 > 管理方案的NuGet套件…

Step 2: 瀏覽 > 搜尋HtmlAgilityPack > 安裝HtmlAgilityPack

*xpath是使用HAPXPathFinder v0.9軟體來尋找出來的,範例檔有提供

Step 3: Coding
using HtmlAgilityPack;
using System.Net;
using System.IO;

string url = "http://www.just-the-word.com/main.pl?word=hello";
string xpath = "/html[1]/body[1]/div[1]/div[3]/div[1]";  //xpath是使用HAPXPathFinder v0.9軟體來尋找出來的

HttpWebRequest httpWebRequest = WebRequest.Create(url) as HttpWebRequest;
try
{
    HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;

     Stream stream = httpWebResponse.GetResponseStream();
     StreamReader reader = new StreamReader(stream, Encoding.UTF8);
     string s = reader.ReadToEnd();
     reader.Close();
     stream.Close();
     httpWebResponse.Close();

     HtmlDocument htmlDoc = new HtmlDocument();

     htmlDoc.LoadHtml(s);
     //16GB 32GB 64GB 的運送時間XPATH
     HtmlNode anchors = htmlDoc.DocumentNode.SelectSingleNode(xpath);
     //HtmlNode anchors32 = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div[2]/div[3]/div/div[2]/div[2]/div[3]/ul/li[2]/label/span/span[3]/span");
     //HtmlNode anchors64 = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div[2]/div[3]/div/div[2]/div[2]/div[3]/ul/li[3]/label/span/span[3]/span");

     //output
     //set RichTextBox
     richTextBox.Document.Blocks.Add(new Paragraph(new Run(anchors.InnerText)));
     //get RichTextBox
     //string richText = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd).Text;
}
catch (WebException web)
{
     //error message
}

完成

參考資料:
http://www.just-the-word.com/main.pl?word=walk&mode=combinations#N N*

範例檔下載

2016年8月25日 星期四

Visual Studio的proerties階層下的Settings.settings功能

Settings.settings的功能可以記錄程式上一次的設定值,當程式重新執行時會恢復上一次的設定,不須重新設定。

執行Visual Studio點選Properties階層底下的Settings.settings會看到如下畫面:
Name:自己取名的變數名稱,在程式執行時期可被用來存取該變數的值。
Type:資料型態,如MicIndex變數的資料型態為int,所以只能放整數數值的資料。
Scope:存取權限的設定,設定User表示可讀寫,設定Application表示只可以讀。
Value:設定變數的值。

取得Settings.settings的變數值(C#語法)
int SelectedIndex = Properties.Settings.Default.MicIndex;

儲存Settings.settings的變數值(C#語法)
Properties.Settings.Default.MicIndex = 1;
Properties.Settings.Default.Save();

以上存取Settings.settings的變數值,可以達到紀錄之前設定值的功能。

P.S.,
Application.Exit();     //先停止線程,再停止進程。
Environment.Exit(0);   //直接停止進程。

進程是一個應用程式在處理機上的一次執行過程,它是一個動態的概念,而線程是進程中的一部分,進程包含多個線程在遠行。原文網址:https://read01.com/5M5ENQ.html

2016年8月5日 星期五

[WPF] GroupBox裡面放多個控制項

WPF的GroupBox只能放一個控制項(例如:只能放一個Button或TextBox等)進去,所以要用另一個容器來當中介,這邊使用的是StackPanel,結果如下圖利用StackPanel當中介把三個CheckBox放到GroupBox裡面。

2016年7月30日 星期六

[WPF] Microsoft Translator - Text Translation

使用Text Translation之前,先到Microsoft Azure Marketplace註冊Text Translation,取得Text Translation使用權限。
連結到Microsoft Azure Marketplace網站,申請一個帳號,申請完成後登入。
Step 1:  登入後,點選資料標籤,然後再點選要使用的功能,會進入到Step 2的頁面。
Step 2: 右邊選擇想要的付費方案,然後點註冊(已註冊過會顯示取消)。
Step 3: 註冊完想使用的功能後,點我的帳戶,左邊點選開發人員,會看到Step 4頁面。
Step 4: 點選註冊。
Step 5: 在註冊應用程式的頁面,除了用戶端密碼會自動填好,其餘欄位要自己填,填完後按建立。之後在開發應用程式會用到用戶端識別碼與用戶端密碼的資料。
Step 6: 完成應用程式的註冊頁面。
支援翻譯的語言
範例下載 (Text Translation的功能參考範例裡的TextTranslation.cs檔案)

2016年7月8日 星期五

[WPF] 錄音,麥克風音量條, Google Speech To Text

此篇文章主要紀錄如何錄製音檔,然後將錄製好的音檔傳到google的雲端伺服器做語音轉文字的功能,下圖是將錄製音檔的程式邏輯以流程圖的方式呈現。

錄製音檔步驟


範例檔程式包含Speech To Text、Text To Speech、錄音功能。

[WPF]XML資料與WPF控制項連結

讓WPF的控制項來與XML檔案的資料做連結的好處是在日後如果要新增資料,不用動到程式碼,直接修改XML檔案內的資料,程式就會根據XML檔案的修改來更新顯示的資料.

範例(此篇文章最底下)提供的程式是修改XML的語言資料來更新google語音辨識的語言.

綁定XML資料的實現步驟

以下兩張圖是實作程式碼,要存取Xml檔必須先加入System.Xml函式庫


2016年7月7日 星期四

[WPF] Text To Speech

此範例會使用到兩個函式庫System.Speech.Synthesis和NAudio.Wave


選擇男生或女生發音是決定於自己的系統有沒有安裝男生或女生發音,以我的電腦只有女生發音(如下圖English只有名子叫Zira女性的聲音),所以沒有男生的發音,即使VoiceGender可以選male,也只有女生的聲音.

範例檔包含Speech To Text和Text To Speech範例 範例檔下載

2016年5月22日 星期日

C# Main() 函式

Main 方法是您一執行程式,就會先執行Main方法,這裡是程式控制項的開始和結束。這個方法將在類別 (Class) 或結構中宣告。它必須是靜態的。且傳回型別可以是 void 或 int。您可以在 Main 方法內建立物件和叫用其他方法。Main 方法能夠以不具參數或具有參數的方式宣告。後面這種格式可使您的程式讀取命令列引數。

下面範例使用Visual Studio來實作帶有args參數的Main函式

Step 1:建立一個主控台應用程式,此範例命名為Main.cs

Step 2:
using System;
class Program{
    static void Main(string[] args){
        int argsLength = args.Length;
        Console.WriteLine("Main方法的參數args的長度:" + argsLength.ToString());
        for (int i = 0; i < argsLength; i++)
        {
             Console.Write("第" + i.ToString() + "位是:");
             Console.WriteLine(args[i].ToString());
        }
    }
}

Step 3:執行ConsoleApplication1.cs,會產生ConsoleApplication1.exe,執行命令提示字元(cmd) ,將命令提示字元路徑切換到ConsoleApplication1.exe存在的路徑下

Step 4:接著輸入ConsoleApplication1 a b c,輸出结果為:


參考: https://msdn.microsoft.com/zh-tw/library/aa288074(v=vs.71).aspx

若不使用命令提示字元,可使用Visual Studio依照下面兩張圖的步驟,預先設定好參數執行即可

2016年4月14日 星期四

[WPF] 文章中搜尋某特定字串

using System.Text.RegularExpressions;

public partial class MainWindow : Window
{
    public void SearchString()
    {
        Match match = Regex.Match("要被搜尋的文章", "指定要尋找的字串", RegexOptions.IgnoreCase);
        // Here we check the Match instance.
        if (match.Success)
        {
            //將文字反白
            tb_article.Select(match.Index, match.Length);
        }   

        //滑鼠選取的字串給a變數
        sting a = tb_article.SelectedText;
    }
}
//在.xaml檔裡設定textbox屬性,可以完成複製和貼上多行的功能
<textbox acceptsreturn="True" x:name="tb_article"></textbox>
tb_article為TextBox

2016年2月20日 星期六

LINQ (Language-Integrated Query)

LINQ 是用來查詢有多筆資料集合的物件技術,像是當陣列物件有10個索引的大小,就可以使用LINQ語法來查詢陣列中符合設定條件的資料,不像傳統的方式需要從陣列的第零個索引開始一個一個比對資料,來找出想要的資料。
範例:
    // Specify the data source.
    int[] numbers = new int[] { 5, 12, 29, 100, 163 };   
    // Define the query expression.
    IEnumerable numberQuery = from number in numbers
                                  where number > 50
                                  select number;
    // Execute the query.
    foreach (int i in numberQuery)
    {
        Console.Write(i + " ");
    } 
    // Output: 100 163
*LINQ適用於SQL資料庫、XML、ADO.NET資料集,和任何由支援 IEnumerable 或泛型 IEnumerable 介面的物件組成的集合。

2016年2月12日 星期五

[WPF] 存取Excel檔案資料in C#

如果想要存取Microsoft Office的軟體,需先裝Database Engine才可以讓自己寫的程式跟Office軟體做溝通,不管是Excel或Access等都好,安裝完成後,在Visual Studio加入兩個參考:

1. LinqToExcel 這個.dll檔需要另外在NuGet套件安裝,目前只提供快速查詢Excel資料的功能,沒有將資料寫入Excel的功能,所以用Microsoft.Office.Interop.Excel來實現寫入的功能.

2. Microsoft.Office.Interop.Excel
using LinqToExcel.Attributes;
class Guest
{
    //將Excel欄位名稱與程式變數連結
    //the name of column in excel file, 引號內的名稱是Excel檔案的欄位名稱
    [ExcelColumn("時間戳記")]
    public string Time { get; set; }
    [ExcelColumn("姓名 : ")] 
    public string Name { get; set; }
    [ExcelColumn("職稱 : ")] 
    public string Jobtitle { get; set; }
    [ExcelColumn("學校 : ")]
    public string School { get; set; }
    [ExcelColumn("科系 : ")] 
    public string Depart { get; set; }
    [ExcelColumn("手機 :")] 
    public string Phone { get; set; }
    [ExcelColumn("E-mail : ")] 
    public string Email { get; set; }
    [ExcelColumn("餐點 : ")]
    public string Meal { get; set; }
    [ExcelColumn("卡號")] 
    public string CardNum { get; set; }
}
//讀取Excel資料
string pathToExcelFile = @"G:\e_register\e_register\SIGRegistration.xlsx";  //s
string sheetName = "sheet1";  //Excel檔案內的sheet名稱
var excelFile = new ExcelQueryFactory(pathToExcelFile);
var artistAlbums = from a in excelFile.Worksheet(sheetName) where a.CardNum == tb_cardnum.Text select a;
foreach (var a in artistAlbums)
{
    tb_name.Text = a.Name;   //tb_name為TextBox元件名稱,以下一樣
    tb_cellphone.Text = a.Phone;
    tb_depart.Text = a.Depart;
    tb_school.Text = a.School;
    tb_jobtitle.Text = a.Jobtitle;
    tb_email.Text = a.Email;
}
//將資料寫入Excel
string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='G:\e_register\e_register\SIGRegistration.xlsx';Extended Properties=Excel 12.0";
using (OleDbConnection oledbConn = new OleDbConnection(ConnectionString))
{
    oledbConn.Open();
    string sql = "Update [sheet1$] set 時間戳記 = @p1 where 卡號=@p2";
    using (OleDbCommand cmd = new OleDbCommand(sql, oledbConn))
    {
        cmd.Parameters.AddWithValue("@p1", DateTime.Now.ToString());
        cmd.Parameters.AddWithValue("@p2", tb_cardnum.Text);
        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}
附件有結合RFID僅供參考程式碼

2016年1月15日 星期五

更換編譯後產生的執行檔路徑

用原始的方式編譯程式檔需要回到csc.exe的目錄下,此篇用批次檔(.bat)方式更改執行檔產生位置。

實作:
開啟記事本,輸入下列圖片中的文字,存檔,副檔名改成".bat",執行剛儲存的批次檔,會看到開啟命令提示字元,會發現命令提示字元顯示的路徑,是批次檔所在的路徑,因此只要將程式檔(.cs)放到跟批次檔同一個目錄下,然後在命令提示字元打上檔名.cs,按下Enter就會在同一個目錄下產生編譯後的執行檔,如此就不用再回到csc.exe的目錄下。
批次檔
命令提示字元

C#基本編譯方式


在剛開始學習程式設計時,學習者大部分都是從網路上或買相關書籍回來學習,而這些參考資料都是直接使用編程軟體進行教學,未講解背後編譯流程,因此在此補充說明底層運作模式。 *此說明以C#語言做為範例 C#的程式檔副檔名是".cs",那要如何執行C#的程式檔,首先在你們的目錄下找到一個C#的編譯器名稱叫做"csc.exe",我的目錄是C:\Windows\Microsoft.NET\Framework\v4.0.30319,它會把我們寫的高階程式語言轉換成電腦懂得機器語言。 

實作:
開啟記事本,輸入下圖程式碼後存檔(任何路徑都可以),副檔名改為".cs",打開命令提示字元,將路徑改為csc.exe的所在路徑,按Enter,然後輸入csc 程式檔儲存路徑\程式檔名稱.cs,按Enter,如果出現存取被拒,請用系統管理員身分開啟命令提示字元就可以了。

程式檔
命令提示字元

編譯成功後回到csc.exe的目錄下,可以找到編譯成功後產生的Hello執行檔,點兩下,會發現它閃一下就關掉了,它其實有印出Hello只是電腦執行速度太快了,程式執行結束就關閉了,可以加個停止的程式碼,像是Console.ReadLine()。

2015年12月21日 星期一

[WPF] 從Access檔案直接轉成類似Excel的圖表呈現 (有提供原始碼)

加入參考System.Windows.Controls.DataVisualization.Toolkit

在開頭引用參考
<window xmlns:DVC="clr-namespace: System.Windows.Controls.DataVisualization.Charting; assembly=System.Windows.Controls.DataVisualization.Toolkit"> 

加入圖表控制項"<DVC:Chart>",P.S., "DVC"是自己定義的名稱
參考下圖程式
using System.Collections.Generic;
using System.Windows.Controls.DataVisualization;
using System.Windows.Controls.DataVisualization.Charting;
//宣告變數
var listmed = new List>();
var listatten = new List>();
var listdelta = new List>();
var listtheta = new List>();
var listalpha1 = new List>();
var listalpha2 = new List>();
var listbeta1 = new List>();
var listbeta2 = new List>();
var listgamma1 = new List>();
var listgamma2 = new List>();

//圖表的數值
for (int i = 0; i < 180; i++)
{
    listmed.Add(new KeyValuePair(int.Parse(cn.txt_meditation[i]), i + 1));
    listatten.Add(new KeyValuePair(int.Parse(cn.txt_attention[i]), i + 1));
    listdelta.Add(new KeyValuePair(int.Parse(cn.txt_delta[i]), i + 1));
    listtheta.Add(new KeyValuePair(int.Parse(cn.txt_theta[i]), i + 1));
    listalpha1.Add(new KeyValuePair(int.Parse(cn.txt_alpha1[i]), i + 1));
    listalpha2.Add(new KeyValuePair(int.Parse(cn.txt_aloha2[i]), i + 1));
    listbeta1.Add(new KeyValuePair(int.Parse(cn.txt_beta1[i]), i + 1));
    listbeta2.Add(new KeyValuePair(int.Parse(cn.txt_beta2[i]), i + 1));
    listgamma1.Add(new KeyValuePair(int.Parse(cn.txt_gamma1[i]), i + 1));
    listgamma2.Add(new KeyValuePair(int.Parse(cn.txt_gamma2[i]), i + 1));
}

    //將數值顯示在圖表上
    ((LineSeries)mcChart.Series[0]).ItemsSource = listmed;
    ((LineSeries)mcChartatten.Series[0]).ItemsSource = listatten;
    ((LineSeries)mcChartDelta.Series[0]).ItemsSource = listdelta;
    ((LineSeries)mcChartTheta.Series[0]).ItemsSource = listtheta;
    ((LineSeries)mcChartalpha1.Series[0]).ItemsSource = listalpha1;
    ((LineSeries)mcChartalpha2.Series[0]).ItemsSource = listalpha2;
    ((LineSeries)mcChartbeta1.Series[0]).ItemsSource = listbeta1;
    ((LineSeries)mcChartbeta2.Series[0]).ItemsSource = listbeta2;
    ((LineSeries)mcChartgamma1.Series[0]).ItemsSource = listgamma1;
    ((LineSeries)mcChartgamma2.Series[0]).ItemsSource = listgamma2;

程式範例操作步驟
選擇檔案
路徑G:\ExcelFigure\ExcelFigure\bin\Debug\brainwave\m1
點選加入的檔案
點選下拉式選單選擇想看的數值資料
結果呈現

2015年12月19日 星期六

[WPF] 提示畫面功能Splash Screen

SplashScreen splash = new SplashScreen("img.png")
//splash.Show(true)表示提示圖片顯示後會自動消失,若把true改為false,提示圖片會一直顯示,直到執行splash.Close(new TimeSpan())
splash.Show(true);
//從開始消失到完全不見的時間為5秒
splash.Close(new TimeSpan(0,0,5));  
P.S., SplashScreen只能用於顯示圖片的提示,不能做文字提示

[WPF] 更改Button外觀樣式

在Xaml檔案,輸入如下圖片中的程式


顯示樣式為upper-right的樣子

2015年12月18日 星期五

[WPF] Model-View-ViewModel (MVVM)

MVVM 是 Model-View-ViewModel 的縮寫, 是一種撰寫程式設計的方式,以MVVM的方式撰寫程式,可以降低程式之間的相依性,使每個程式負責的內容分工的很清楚;使用者介面程式歸使用者介面程式,商業邏輯程式歸商業邏輯程式,資料歸資料,在日後的修改、維護上比較容易。下圖為MVVM的示意圖,上層是較接近跟使用者的互動,下層是較接近程式設計者。


*注意:上圖中的箭頭是有意義的,上層的物件可以向下存取,但是下層的物件並不會知道上層的東西長什麼樣子,透過此原則,才得以做到乾淨的分層與鬆散藕合。

各層分工如下:
·                  Model : 用來描述資料實體(Entity)的簡單類別(Class),也可以在這邊實作商業邏輯以及與資料庫溝通等資料存取相關的功能。

·                  View : 其實就是XAML檔,也就是使用者介面,使用者介面設計人員只需要在Blend中進行對它的編輯,並透過Binding來和ViewModel溝通(DataContext指定為某個ViewModel,以更進一步的與其中的屬性進行Binding)。

·                  ViewModel : 就是供View使用的Model,透過公開的屬性(public property)       給View進行Binding,供其使用。

內容部分引用來自 :
https://www.dotblogs.com.tw/ouch1978/archive/2011/04/23/introducing-mvvm.aspx

http://blog.sanc.idv.tw/2011/12/wpf-mvvm.html

範例原始碼 Source Code

2015年11月26日 星期四

[WPF] C# 停止工作管理員中在執行的應用程式

注意下圖的字串Questionnaire是比照工作管理員顯示的名子,不加副檔名




[WPF] C# 讓控制項根據不同電腦的畫面(解析度)調整大小和位置

Step 1. 要把"Grid"設定高度跟寬度,這樣之後再加入其他控制項會比較好調整大小.
Step 2. 在XAML加入和如下圖,需要注意的是Viewbox不要設定寬、高的值,否 
                      則就不會動態調整大小了.



2015年11月20日 星期五

[WPF] 利用介面檔,在不同專案間傳值. Passing Values Between Multiple Projects by Interface

Step 1. (建立介面檔) 新增專案 -> 選擇類別庫 -> 確定.

Step 2. 建立後會是一個類別(Class), 將類別改為介面(Interface),並新增一成員(passValue),如下圖所示.

Step 3. 完成後執行(快捷鍵 F5),會出現下圖訊息,不用太在意,按OK.

Step 4. 到該專案的Debug目錄下,即可看到產生一個.dll檔,之後會用到. 

 Step 5. 建立第一個專案,記得選WPF應用程式.

 Step 6. 接著,加入剛建立.dll檔.

 Step 7. 將剛建立.dll (Interface.dll) 打勾->確定.

Step 8. 加入程式碼,如下圖.

Step 9. 執行(F5).

 Step 10. 執行後,會在該專案的Debug目錄下產生.exe檔 (getValue.exe),在另一個專案會用到.

Step 11. 建立第二個專案.

 Step 12. 加入getValue.exe和Interface.dll 到該專案的參考.

  Step 13. 將getValue.exe和Interface.dll 打勾加入到該專案的參考.

Step 14. 加入程式碼,如下圖. (完成).

Step 15. 執行結果.

P.S.,有原始碼附件 Source Code