XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2014/06/30

將圖片檔案直接設定到 BitmapImage

若想再增加 XAML 對於圖片檔案顯示的速度,您可以使用 BitmapImage 物件,將圖片檔案讀入到 BitmapImage 物件內,接著,您就可以將這個 BitmapImage 物件 設定到 XAML Image Element的 Source 屬性上,如此,就可以直接顯示出該圖片。

                StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFolderAsync(filename);
                IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
                BitmapImage bitmapImage = new BitmapImage();
                await bitmapImage.SetSourceAsync(stream);

                 this.XAMLImageElement.Source = bitmapImage ;



使用 HttpClient 下載圖片檔案到本機的 Isolated Storage

若您在 WinRT 系統下,有些時候您會想要自己將網路上的圖片檔案,下載到本機  Isolated Storage 檔案系統內,這個圖片檔案可以做為快取之用,下次當要顯示該圖片的時候,就可以直接從本機  Isolated Storage 目錄下,直接讀取這個圖片檔案出來顯示。

            var httpClient = new HttpClient();

            var randomAccessStream = new InMemoryRandomAccessStream();

            var contentUri = "http://host/path/path/name";
            var filename = "your file name";

            using (var responseStream = await httpClient.GetStreamAsync(new Uri(contentUri)))

                 StorageFolder folder = await ApplicationData.Current.LocalFolder;
 
                using (var fileStream = await folder.OpenStreamForWriteAsync(filename , CreationCollisionOption.ReplaceExisting))
                {
                    await responseStream.CopyToAsync(fileStream);
                    responseStream.Dispose();
                }



如何判斷 StorageFile 或者 StorageFolder 所指向的檔案是否存於 Isolated Storage 內

之前不論在寫 WinRT 或者 Windows Phone App的時候,一定會遇到這樣的需求,那就是想要檢查在 Isolated Storage 內的某個檔案是否存在,並且根據此一結果,決定接下來要怎麼繼續處理。


        public async Task 該圖片檔案是否已經存在於本機(string filename)
        {
            bool Exist = false;

            var md5String = MD5Core.GetHashString(圖片路徑);

            StorageFolder folder = await ApplicationData.Current.LocalFolder;
            var files = await folder.GetItemsAsync();
            Exist = files.FirstOrDefault(p => p.Name == filename) == null ? false : true;
            return Exist;
        }


在 Windows 8.1 底下使用 RenderTargetBitmap 來儲存 XAML Element 的圖片

有些時候,我們希望能夠儲存某個頁面或者某個XMAL控制項當時畫面結果,到本機上的圖片檔案中,我們就可以使用底下的程式碼來做到這樣的需求。

首先,我們使用建立個RenderTargetBitmap物件,並且使用了 RenderAsync 方法,產生該 XAML 控制項 gd測試圖片 的影像來源輸入的緩衝區資料流。

接著我們使用了 FileSavePicker 讓使用者選擇要將該圖片檔案儲存到本機的哪個目錄下。

最後,我們就可以透過 BitmapEncoder 物件,SetPixelData 與 FlushAsync 方法,將該影像來源的緩衝區資料流,寫入到檔案內。


            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync(gd測試圖片);
            // 1. Get the pixels
            IBuffer pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
            var pixels = await renderTargetBitmap.GetPixelsAsync();

            var filePicker = new FileSavePicker();

            filePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;

            var textFileExtension = new[] { ".jpg" };
            var dataFileExtension = new[] { ".png" };

            filePicker.FileTypeChoices.Add("JPG", textFileExtension);
            filePicker.FileTypeChoices.Add("PNG", dataFileExtension);

            IAsyncOperation< storagefile > asyncOp = filePicker.PickSaveFileAsync();
            StorageFile file = await asyncOp;

            if (file == null)
            {
                return;
            }

            
            using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await
                    BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                byte[] bytes = pixels.ToArray();
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                     BitmapAlphaMode.Ignore,
                                     (uint)gd測試圖片.Width, (uint)gd測試圖片.Height,
                                     96, 96, bytes);

                await encoder.FlushAsync();
            }

2014/06/29

好用的 XAML 資料繫結 Data Binding 的轉換器 Converter > 字串為空值 Visibility

當我們使用 XAML 資料繫結 Data Binding的時候,透過轉換器 Converter,可以很容易地透過來源資料 Source Data 的數據值,直接控制或者影響 XAML 控制項 (Element)的顯示特性或者顯示內容。

底下是我常用的一個轉換器(Converter),當來源資料的欄位為字串類型的時候,並且該字串的為空字串,這個時候,該轉換器會回傳 Visibility.Visible 或者 Visibility.Collapsed ,這樣,就可以控制項是否要顯示出來。

這樣的轉換器通常我會用於:若主題或者說明文字不存在的時候,不要顯示相對應的按鈕或者圖片,是個相當好用的轉換器


public sealed class EmptyStringToVisibilityConverter : IValueConverter
{
    public object Convert(object valueType targetTypeobject parameterstring language)
    {
        return (value is string && (string)value != ""? Visibility.Visible : Visibility.Collapsed;
    }
 
    public object ConvertBack(object valueType targetTypeobject parameterstring language)
    {
        return value is Visibility && (Visibility)value == Visibility.Visible;
    }
}


最後,記得當要在某個頁面中使用該轉換器的時候,要加入該轉換器當時的命名空間 namespace 宣告,並且定義該轉換器成為可用的 Key
<Converters:EmptyStringToVisibilityConverter x:Key="EmptyStringToVisibilityConverter"/>


<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:VulcanApp.Common"
    xmlns:Converters="using:VulcanApp.Converters"     
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d">
    <Converters:EmptyStringToVisibilityConverter x:Key="EmptyStringToVisibilityConverter"/>

好用的 XAML 資料繫結 Data Binding 的轉換器 Converter > bool Visibility

當我們使用 XAML 資料繫結 Data Binding的時候,透過轉換器 Converter,可以很容易地透過來源資料 Source Data 的數據值,直接控制或者影響 XAML 控制項 (Element)的顯示特性或者顯示內容。

底下是我常用的一個轉換器(Converter),當來源資料的欄位值為 True 或者 False 的布林值的時候,該轉換器會回傳 Visibility.Visible 或者 Visibility.Collapsed ,這樣,就可以控制項是否要顯示出來。


public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object valueType targetTypeobject parameterstring language)
    {
        return (value is bool && (bool)value == true? Visibility.Visible : Visibility.Collapsed;
    }
 
    public object ConvertBack(object valueType targetTypeobject parameterstring language)
    {
        return value is Visibility && (Visibility)value == Visibility.Visible;
    }
}

最後,記得當要在某個頁面中使用該轉換器的時候,要加入該轉換器當時的命名空間 namespace 宣告,並且定義該轉換器成為可用的 Key
<Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>


<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:VulcanApp.Common"
    xmlns:Converters="using:VulcanApp.Converters"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d">
    <Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>


2014/06/28

將 Windows 8.1 Store App 透過 Sideload 側載 方式,安裝到您企業內部使用者電腦上

Windows 8.1 的 WinRT Stroe App 與傳統的桌面程式,有著明顯不同的特性,其實,對於程式開發者而言,採用 WinRT Store 架構來開發的App,真的比起傳統的桌面App方便了許多,因為:它是全螢幕的、擁有良好的App運作流程、不會破壞到作業系統與影響其安全運作、可以觸控操作、流暢的表現和互動式的動畫。

單純開發Windows 8.1 Store App,也許不會太困難,因為,只要您具有 C# / VB / JavaScript / C++,立馬就可以馬上來開發,甚至開發出不錯的App;可是,大部分開發出來的App,都會提交到 Windows Store 市集做認證,一旦通過審核,就會在市集的App上,看到您開發出來的App,而使用者就可以透過市集App,下載並且安裝您開發出來的App到他們的電腦上。

可是,當您想要開發 Windows 8.1 Store App,並且想要將這個App (例如 line-of-business LOB 類型)讓企業內部的電腦使用,不過,您不想要透過微軟官方的市集來讓使用者從市集App找到專屬於您企業的App,甚至從市集下載您專屬App到企業員工的電腦上,這可就傷腦精了;因為,到現在為止,微軟並沒有針對 Windows 8.1 平台,推出各企業專屬的市集App,也就是說,想要把您開發出來,並且專屬於自己企業的Windows Store App到企業內部員工的電腦上,就不是這麼簡單的過程,這需要花點時間來處理。

想要佈署Windows 8.1 Store App到使用者的電腦上,而不透過微軟官方的公開市集系統,您可以採用的是 [側載] Sideloading 技術 (側載的應用程式不需要發行到 Windows 市集,也不需要使用已註冊的 Windows 市集開發人員帳戶就能開發。),讓您可以輕鬆地做到這樣的需求。

側載是個方法,可以讓您安裝 Windows Store App到電腦上,但是不透過市集App,這樣,就有幾個問題要考量:

  1. 開發出您企業專屬的 Windows Store App
  2. 如何將App的程式,自動佈署到使用者的電腦上
  3. 如何將這些App程式,安裝到使用者電腦上
  4. 如何進行新版本的App升級

開發出您企業專屬的 Windows Store App
這個部分與您開發可以上傳到微軟市集上的App的技術一樣,差別在於,您的App不需要透過微軟官方的測試與審核,因此,您需要自己透過內建工具來做App相容性的測試,與自己確保App的執行品質與效能。

不過,若是要將 LOB 類型的App透過側載的方式安裝到企業內部電腦上,您所開發的App,需要安裝與設定您企業內部發出的憑證,這個明證並不一定要在信任的憑證授權單位的跟目錄上,只要讓企業內部使用者的電腦可以信任該憑證即可。如果憑證來自於其中一個已經信任的授權單位,您就不需要在目標電腦上部署和管理額外的憑證。

另外要注意的是,若您開發的Windows 8.1 Store App有使用了 Windows 推播通知服務 (WNS) 等功能,則您需要使用 Windows 市集的儀表板,來為該應用程式保留名稱,並且要將您這個應用程式與市集上所指派的發行者名稱產生關聯,而且也要受到您電腦的信任。

如何將App的程式,自動佈署到使用者的電腦上
這裡有著許多來自於微軟的技術、甚至於還有很多第三方的產品可以選擇;微軟這裡也提供了一些需要付費或者免費的解決方案:Windows PowerShell, Microsoft Deployment Toolkit (MDT), System Center Configuration Manager, Windows Intune,至於這些功能是如何、甚至於如何運作,這需要請您們管理 AD Domain 的 IT 技術人員協助您來處理這些需求,畢竟這些範疇不是會寫程式的人,就會處理的。

如何將這些App程式,安裝到使用者電腦上
您企業內部的使用想要享受到側載的功能,必須是 Windows 8.1 Enterprise 企業版 或者是 Professional 專業版,並且要能夠加入網域;這樣您就可以透過群組原則 Group Policy 來設定這些電腦 網域群組原則物件 (GPO),可以接受並安裝,不是來自於市集的 Windows 8.1 Store App (允許安裝信任的應用程式)。

不過,若想要讓其他類型的Windows 8.1作業系統,例如 Windows RT 版本、Professional 專業版,您需要額外購買啟用可以側載的產品金鑰,以便進行企業側載。

要啟用側載產品金鑰,請以系統管理員權限,開啟命令提示字元,然後輸入下列命令來新增側載產品金鑰。

Slmgr /ipk <側載產品金鑰>

輸入下列命令來啟用側載金鑰:
slmgr /ato ec67814b-30e6-4a50-bf7b-d55daf729d1e

另外,我們還需要做到設定有開發人員授權的企業電腦

在電腦中,針對要套用群組原則設定的網域群組原則物件 (GPO) 開啟群組原則管理編輯器,如下方所指定。

  • 按一下以展開 [電腦設定]、[系統管理範本]、[Windows 元件] 及 [應用程式套件部署]。
  • 按兩下 [允許在沒有安裝開發人員授權情況下開發 Windows 市集應用程式] 設定。
  • 在 [允許在沒有安裝開發人員授權情況下開發 Windows 市集應用程式] 視窗中,按一下 [啟用],然後按一下 [確定]。
  • 按兩下 [允許安裝所有信任的應用程式] 設定。
  • 在 [允許安裝所有信任的應用程式] 視窗中,按一下 [啟用],然後按一下 [確定]。

將群組原則設定為允許在沒有安裝開發人員授權情況下開發 Windows 市集應用程式,下列登錄設定會更新為:HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowDevelopmentWithoutDevLicense = 1
將群組原則設定成允許信任的應用程式後,會更新下列登錄設定:HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowAllTrustedApps = 1

最後,可以使用 Windows PowerShell 或者任何支援執行 PowerShell指令碼或者Cmdlet的管理工具,在 PowerShell 命令提示字元中輸入底下文字,就可以進行您開發的App,並且側載到使用者電腦上了

add-appxpackage C:\YourEnterprise\YourStoreApp.appx

如何進行新版本的App升級
對於這個問題,是比較棘手的,若您的App是透過市集安裝的,使用者可以透過市集App來了解到他們已經從市集下載、安裝的App,有哪些App已經推出了新版本;使用者只需要透過市集App就可以直接升級這個App到最新版本。若是採用側載方式,則還是需要使用上述的方式來進行,並且我們可能也需要在App中,實作是否有新的版本推出機制。




如何在 Windows 8 App 中,使用 XAML 做到 Responsive 響應式 設計

現在一般網頁開發,大多需要具備Responsive Web Design (RWD) 響應式網頁設計,也就是,能自動針對不同 size 的裝置調整網頁最佳的呈現方式,讓使用者操作經驗更好。

若我們在進行 C# / XAML 的 Windows Phone App 開發的時候,也希望我們的頁面能夠根據手機的轉向,自動進行調整,不需要任何的 [後置程式碼] (Code Behind) C# 程式碼來支援,也就是不需要透過任何的事件來呼叫與執行任何 C# 程式碼,這樣的需求,我們應該要如何做到呢?

這樣的問題是許多第一次接觸 Windows Phone App 的開發者所必定會遇到的問題,讓我們來看看底下的範例說明,在這個範例中,我們有兩個按鈕與一個文字要顯示在同一行中,當手機的轉向是直式的時候,會呈現如下圖的樣貌;這兩個按鈕分別要存在於左右兩邊,文字則需要顯示在兩個按鈕之間,而且中間的文字需要依據當時手機解析度,自動調整最大寬度與高度之可以最多顯示文字。


若手機轉個90度,上述需求需要同時存在,不過,在橫式頁面上,文字可以顯示的寬度會變得更大,而且可以看到的文字字數應該要更多,如同下圖所顯示。


這樣的需求真的可以做到嗎? 我們來看看這個頁面的 XAML 定義。

<!--LayoutRoot 是放置所有頁面的根資料格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
 
        <!--TitlePanel 包含應用程式的名稱和頁面標題-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="我的應用程式" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="頁面名稱" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
 
        <!--ContentPanel - 其他內容置於此-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <!--在這使用 Grid 來將這三個控制項定義在-->
            <Grid Height="100" VerticalAlignment="Top" >
                <!--左邊的按鈕-->
                <Button HorizontalAlignment="Left">Add</Button>
 
                <!--中間的文字-->
                <TextBlock Text="這是要 顯示的 文字內容 這是要 顯示的 文字內容 這是要 顯示的 文字內容 這是要 顯示的 文字內容 這是要 顯示的 文字內容 這是要 顯示的 文字內容 " Margin="100,0,100,0" TextWrapping="Wrap"/>
 
                <!--右邊的按鈕-->
                <Button HorizontalAlignment="Right">Add</Button>
            </Grid>
        </Grid>
 
    </Grid>

我們將這三個控制項使用 Grid 面板(Panel)定義在其裡面,並且記得:
左邊的按鈕
需要使用 HorizontalAlignment="Left",設定該按鈕需要往左對其

右邊的按鈕
需要使用 HorizontalAlignment="Right" ,設定該按鈕需要往右對其

中間的文字
請使用 Margin="100,0,100,0" 設定左右的邊界各為100,目的是要保留文字的左右顯示邊界,不要蓋到按鈕;接著在 TextBlock 控制向上設定屬性 TextWrapping="Wrap" ,讓 TextBlock 根據當時可用的空間,顯示出最多的文字。

這樣就可以做到 [響應式] (Responsive) 的 Windows Phone App 頁面設計技巧了。

若每次要測試手機轉向 直式 / 橫式 的執行結果,都要透過執行程式才能夠看到最後結果,那麼,您對於 Windows Phone 開發工具必定不是十分孰悉,記得這句話,若是可以在設計模式下就可以看到的結果,就要讓您的設計內容可以於設計模式下看到每個頁面的最後執行結果,不需要等到執行時期才能夠看到。(也許您會問說,這樣會有問題,有些頁面上面有許多控制項,裡面的資料需要等到執行時期才能夠透過 C# 程式透過本地檔案或者從網路抓取才能夠讀取出來,並且顯示在頁面上,例如,圖片檔案,JSON內容;不用擔心,您只需要學會設計時期的範例資料的功能,就可以讓您的App的每個頁面,在設計時期的時候,模擬出需要再執行時期才能夠看到的資料,這樣不但可以加入您的程式開發時程,而且可以讓您在設計時期,就可以知道未來執行後的每個頁面真實的樣貌,我會另外寫篇文章告訴大家如何做到這樣的需求)

請在您的 Visual Studio (或者 Blend (這是個好東西,想要成為 Windows Phone 開發專家,一定要學會 Blend) ),使用 [裝置] 視窗來調整您設計時期的頁面螢幕轉向,如下圖所示的紅色方框,左邊的圖示就是讓您的設計時期的手機螢幕轉向成為橫式,而右邊的圖示,就是可以將您設計時期的頁面轉向成為直式。








為什麼無法在 C# 中,同時使用 static 與 const 呢?

其實,原因十分簡單,那就是,所有的常數 (constants),要使用 const 來標示,而且,常數暗示就是靜態 (static) 特性,因此,您無法在宣告嘗試成員的時候,也用 static 來標示。

C# 支援那些逃脫字元 escape character

C# 定義了底下可以使用的逃脫字元,您可以在字串表示式中,使用這些逃脫字元來標示出特別的字元:

\' - 單引號
\" - 雙引號
\\ - 反斜線\
\0 - Unicode 0
\a - 警告聲
\b - 退回鍵
\f - 強制跳頁
\n - 換行
\r - 歸位
\t - Tab
\v - 垂直定位鍵
\uxxxx - Unicode 逃脫字元,用來表示 Unicode xxxx 數值編碼所代表的文字
\xn[n][n][n] - Unicode 逃脫字元,用來表示 Unicode xxxx 十六進位數值編碼所代表的文字

哪裡可以取得 C# 語法的規格文件

寫程式到某個階段,我喜歡把這些工具、程式語言做個深入透徹的了解,這樣,日後再使用這個程式語言開發的時候,就可以盡情地善用這個工具所提供的各項特色與優勢,不過,C#的語言定義文件在哪裡,是否有這個文件呢?

有兩個地方可以取得,微軟與ECMA。在 ECMA 的 Ecma-334 的文件,就是 C# 5.0 的語言定義文件,不過,這裡只有 PDF 格式文件。在微軟的下載中心 (Microsoft Download Center),您可以取得 Word 版本的 C# 5.0 語言定義文件。

2014/06/27

有沒有關於 c# async/await 得不錯文章可以參考

在C# 5.0的時候,我們可以使用 async / await 來幫助我們解決非同步(例如,讀寫檔案系統上的檔案、抓取網路上的資源、存取 Restful API等等)程式設計上的需求,在以往沒有 async / await 功能的時候,我們要處理非同步的功能,一來會造成程式不太好寫,二來程式碼會變得又臭又長,而且不太好維護與除錯和控制。

現在,我們可以透過 C# 的非同步程式設計 async / await 來解決長久以往困擾大家的問題,不過,若只是一知半解,往往會造成一個好用的工具,卻無法幫助您解決實際上的問題;不要想太多,現實上沒有速成、簡單的技巧,讓您可以靈活運用 async / await 這個工能,花點時間,深入研究 async /await 這個特色,一定會對於您日後程式開發上,會相當有幫助的。

這裡有些不錯的文章,是您要學習 C# 非同步處理 async / await 必須要看過的:




這個文章是 MSDN 上關於C# 非同步使用說明,很多人不喜歡或者不去看 MSDN 的文章,這是您使用微軟開發工具要近身為專業或者大師級的工程師之一大障礙,這就像練武之人,只練拳腳(到網路上找些範例程式碼,剪下來,貼上去 Ctrl + C Ctrol + V),而不練內功(徹底瞭解不同功能的原理與變化,並且有著哪寫潛在的問題,這就需要不斷的閱讀不同的文章與書籍,當然,基礎內功的修練,官方的文章與手冊,是必須要閱讀的),是無法成為武術宗師的,往往這樣的人,最後就只能夠在廟會廣場或者夜市中,表演胸口碎大石,賺點賞金來過河;練拳不練功,到老一場空,這句話一定要放在心裡,必且做到,千萬不要只是放在心裡尊敬著,只要嘴巴說喔。

在這份官方教材中,告訴您如何使用 Async 來幫助您改善程式因為處理非同步需求時候,會造成您的程式被凍結的現象,並且讓您知道如何簡單、方便地透過 Async 來做到以往您做不到的事情;另外,您也可以明瞭 Thread 與 Async 之間是如何處理的、如何取得非同步呼叫的回傳結果、Async / Await 是甚麼,他們之間要如何搭配等等,這些都是您要使用 Async / Await 方法的時候,必須要知道。

想要更加深入這方面的議題,請參考底下 MSDN雜誌上的文章

Easier Asynchronous Programming with the New Visual Studio Async CTP

Asynchronous Programming: Pause and Play with Await

Asynchronous Programming: Understanding the Costs of Async and Await

2014/06/26

在WinRT下,如何取得圖片檔案的內容或者該圖片的縮圖

往往當把圖片檔案儲存到本機的獨立儲存空間 (Isolated Storage),之後想要顯示該圖片,不過,有些時候這些圖片檔案可能會很大,而我們這個時候只想要顯示這些圖片的縮圖大小,作為讓使用者可以快速大量瀏覽或者選取之用,而不想要取得全尺寸的圖片。

這個時候,就可以用到這兩個方法:

StorageFile.GetThumbnailAsync(ThumbnailMode, UInt32, ThumbnailOptions)
依據縮圖的用途、要求的大小以及指定的選項,擷取檔案經過調整的縮圖影像。

StorageFile.GetScaledImageAsThumbnailAsync(ThumbnailMode, UInt32, ThumbnailOptions)
依據縮圖的用途、要求的大小和指定選項,取得縮放影像做為縮圖。

經過這樣的處理,我們就不再需要取得全尺寸的圖片資源,並且透過 XAML 設定來幫我們做圖片的縮放顯示處理,這樣可以大幅提升整體App的運作速度,當您要處理顯示很多圖片的時候,這是個不錯的優化改善方法。

如何針對 StorageFile物件把它關閉起來

一般我們在處理檔案的時候,若不再需要使用該檔案,就需要將這個資源關閉起來,可是,為什麼 StorageFile物件裡面,卻沒有任何關於 Close 這樣的輔助方法呢?

理由很簡單,因為,StorageFile 只是個抽象的路徑名稱,用來代表檔案系統中的某個檔案,也就是說,當您取得了 StorageFile物件後,例如,使用 StorageFolder.GetFileAsync (使用指定的檔案名稱來取得目前資料夾中的單一檔案。)來取得一個 StorageFile 物件,並不代表了這個檔案已經被開啟並且被鎖住了,這個 StorageFile 物件僅僅只是提供了一個參考到這個檔案的資訊而已。

若您實際取得該StorageFile的資料流(Stream),則您才是開始針對該檔案進行存取動作的開始,不過,當對於該檔案的資料流處理動作完成後,記得要將該資料流做關閉(Close)和 Dispose的動作。

您可以依據您的需求,參考底下四種方法,取得您所需求的資料流
StorageFile.OpenAsync 透過檔案開啟隨機存取資料流。

StorageFile.OpenReadAsync 透過目前的檔案開啟隨機存取資料流來讀取檔案內容。

StorageFile.OpenSequentialReadAsync 透過目前的檔案開啟循序存取資料流來讀取檔案內容。

StorageFile.OpenTransactedWriteAsync 開啟可用於異動寫入作業之檔案的隨機存取資料流。

StorageFile storageFile =
      await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);

    var randomAccessStream = await storageFile.OpenReadAsync();
    Stream stream = randomAccessStream.AsStreamForRead();

在WinRT中,有沒有比較輕鬆容易的處理檔案解決方案

當我們在WinRT系統中,想要處理檔案動作,需要透過 StorageFolder取得一個StorageFile,接著要使用相對應的資料流開啟StorageFile指向的檔案,處理完成後,還要關閉與釋放這個資料流,真的有點繁瑣。

我們可以透過 FileIO Class ( 提供協助程式方法用於讀取和寫入檔案,這些檔案是由IStorageFile型別的物件所表示 ) 類別 與 PathIO Class ( 提供 Helper 方法,以使用絕對檔案路徑或 URI 來讀取和寫入檔案 ),來簡化後半段的動作;例如,我們只想針對該檔案讀取所有的文字內容或者將字串寫入到檔案內。

try
{
    if (file != null)
    {
        string fileContent = await PathIO.ReadTextAsync(filePathOrURI);
    }
}
// Handle errors with catch blocks
catch (FileNotFoundException)
{
    // For example, handle file not found
}

在範例中,filePathOrURI 是區域變數,其包含要讀取之檔案的 URI (例如應用程式 URI "ms-appdata://sampleFile.dat") 或檔案系統路徑 (例如 C:\examplepath\sampleFile.dat)。
在 readTextAsync 完成之後,fileContent 變數會取得檔案的內容做為文字字串。接著您可以依適合的情況處理內容。

關於實際更多用法,您可以參考 檔案存取範例

2014/06/25

在WinRT下,如何使用 StorageFile物件,設定該檔案為唯讀

若您有這樣的需求,想要將某個在 Isolated Storage 內的檔案,設定成為唯讀的屬性,此時,您會需要用到:

StorageFile.Properties
取得物件,用以存取檔案的內容相關屬性。

當取得了 StorageFile.Properties屬性後,他是個屬於 StorageItemContentProperties 類型的物件,代表了 提供檔案之內容相關屬性存取權的物件。

參考下列程式碼,您可以設定檔案為唯讀屬性

String key = "System.FileAttributes";
UInt32 FILE_ATTRIBUTES_READONLY = 1;
var pix = Windows.Storage.KnownFolders.PicturesLibrary;

var file = await pix.GetFileAsync("test.jpg");
String[] retrieveList = new String[] { key };

var props = await file.Properties.RetrievePropertiesAsync(retrieveList);

if (props != null)
{
    var temp = (UInt32)props[key] | FILE_ATTRIBUTES_READONLY;
    props[key] = temp;
}
else
{
    props = new Windows.Foundation.Collections.PropertySet();
    props.Add(key, FILE_ATTRIBUTES_READONLY);
}

await file.Properties.SavePropertiesAsync(props);

不需要經由使用者同意,就可以 WinRT App 存取的檔案系統有哪些?

這是個相當不錯的問題,其實我自己也花了不少時間,才逐步清楚這樣的狀況,尤其是在我要取得 [MCSD: Windows Store Apps Using C# 認證] 的時候,必須要對這樣的情境十分孰悉。

原則上,不需要經過使用者同意,而App可以存取的檔案系統只有 套件資料夾 (Package Folder)與應用程式資料資料夾( App Data Folder),若想要存取本機中的 照片、影片、我的文件資料夾,則您需要設定相對應的功能 (Capability),否則,當您存取這些檔案系統的時候,就會產生錯誤。

其中,
套件資料夾 (Package Folder)
可以透過取得 Windows.ApplicationModel.Package.Current.InstalledLocation StorageFolder物件,例如,您可能要針對該App做到可以內建在 OEM 的機器上,並且要存取 StoreManifest.xml 或者 自訂資料 (Custom Data)檔案,這個 StorageFolder 是指向了您的App實際安裝在本機上的目錄路徑。

應用程式資料資料夾( App Data Folder)
Windows.Storage.ApplicationData 是提供對應用程式資料存放區的存取。 應用程式資料是由本機、漫遊或暫時的檔案與設定所組成。
可以該類別透過取得 Windows.Storage.ApplicationData 中的 LocalFolder, RoamingFolder, TemporaryFolder 這三個屬性。

ApplicationData.LocalFolder 取得本機應用程式資料存放區中的根資料夾。
ApplicationData.RoamingFolder 取得漫遊應用程式資料存放區中的根資料夾。
ApplicationData.TemporaryFolder 取得暫存應用程式資料存放區中的根資料夾。

應用程式資料有三個主要類型:
本機:儲存在裝置上,並且跨更新保存。
漫遊:已複製到使用者安裝應用程式的其他裝置。
暫存:隨時可以由系統刪除。

當然,透過應用程式資料資料夾,也可以存取到本機或者漫遊的應用程式設定容器物件。
ApplicationData.LocalSettings 取得本機應用程式資料存放區中的應用程式設定容器。
ApplicationData.RoamingSettings 取得漫遊應用程式資料存放區中的應用程式設定容器。

存取該App中的任何打包的檔案,此時,您就會需要使用到這個套件資料夾,不過,您需要使用 Visual Studio 2013來設定這些資源檔案的類型屬於內容(Content)形式,並且還要設定複製到輸出資料夾內。

如何判斷 StorageFile 或者 StorageFolder 所指向的檔案是否存於 Isolated Storage 內

之前不論在寫 WinRT 或者 Windows Phone App的時候,一定會遇到這樣的需求,那就是想要檢查在 Isolated Storage 內的某個檔案是否存在,並且根據此一結果,決定接下來要怎麼繼續處理。

當然,這樣的需求已經收錄到我自己整理的 Isolated Storage Class Library 內,當作成一個非常好用的 Helper;不過,那個時候所用的方法是:

            try
            {
                if (使用Mutex == true)
                {
                    StorageMutex.WaitOne();
                }
                var file = await folder.GetFileAsync(string.Format("{0}.txt", filename));
                content = await FileIO.ReadTextAsync(file);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(string.Format("Filename:{0}, {1}", filename, ex.ToString()));
            }

使用 GetFileAsync 並且使用異常事件捕捉方法 Try-Catch 將這個方法呼叫予以捕捉,一旦所要讀取的檔案不存在,就會產生異常事件,可以根據這個異常事件(類別 FileNotFoundException)來判斷,是否是由檔案不存在所引起的,不過,這樣的作法太不人道了。

現在有個更好的改善方法可以使用,那就是使用 StorageFile.IsAvailable 屬性來判斷,根據 MSDN 上的說法,StorageFile.IsAvailable 是:如果檔案位於本機、已在本機快取或可供下載,則為 True。否則為 false。您說,使用這個方法是不是更加方便了呢?

另外,在 Windows 8.1,也推出了另外一個相當不錯的方法:StorageFolder.TryGetItemAsync,這個方法為,嘗試使用項目名稱來取得目前資料夾中的單一檔案或子資料夾;在以往,我們需要自己寫個擴充方法來做到

  public static class StorageFolderExtensions
  {
    public static async Task TryGetItemAsync(this StorageFolder folder, 
                                                           string name)
    {
      var files = await folder.GetItemsAsync().AsTask().ConfigureAwait(false);
      return files.FirstOrDefault(p => p.Name == name);
    }
  }

現在,我們只需要簡單的使用下列方法,既可以透過 StorageFolder 物件的 TryGetItemAsync 來判斷出,在該目錄下,這個檔案或者子資料夾是否存在了。

StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync("test") as StorageFile;
 
if (file != null)
{
}

當然,若您開發的Windows Phone 8.1 App,採用的 Universal App,也可以使用這樣的解決方案喔。

關於檔案的 URI 配置

當要存取某個檔案的時候,我們可以使用ApplicationData Class (提供對應用程式資料存放區的存取。 應用程式資料是由本機、漫遊或暫時的檔案與設定所組成)來取得相對應的 StorageFolder物件,接著依序取得檔案所在位置的目錄 StorageFolder物件,接著取得該目錄下的檔案 StorageFile物件,如此,就可以針對該檔案來進行操作了。

不過,我們可以透過檔案的 URI(統一資源識別元)配置,指出該檔案所在的路徑,我們可以參考這些檔案是來自於 [應用程式套件]、[資料資料夾]或[資源]的應用程式檔案。

ms-appx
配置參考來自應用程式套件的應用程式檔案 (請參閱應用程式套件與部署)。
這類檔案通常為靜態影像、資料、程式碼及配置檔。


        void PopupForSheetMusic_Closed(object sender, object e)
        {
            this.imgSheetMusic.Source = new BitmapImage(new Uri("ms-appx:///Assets/Images/Core/btn_sheet music_n.png"));
        }


        public MyChannelData()
        {
            this.ID = RandomString(20);
            this.OrderNo = 99999;
            this.Title = "";
            this.CreateDatetime = DateTime.Now;
            this.RecordLength = TimeSpan.FromSeconds(0);
            this.GetProductInfo_Data = new GetProductInfo_Response_Data();
            this.RecordingType = Business.RecordingType.VIDEO;
            this.Cover = "ms-appx:///Assets/Images/Core/img_voice_picture.png";
        }


ms-appdata
使用 ms-appdata 配置來參考應用程式檔案,這些檔案來自應用程式的本機、漫遊及暫存資料資料夾。

若想要讀取[本機]、[暫存]、[漫遊]這三個資料夾,可以使用下列的 URI

本機資料夾  ms-appdata:///local/
暫存資料夾  ms-appdata:///temp/
漫遊資料夾  ms-appdata:///roaming/

                    if (xi.Count >= 1)
                    {
                        di.Cover = xi[0].GetProductInfo_Data.ProductCover;
                        di.Cover = string.Format("ms-appdata:///local/CoverImages/{0}.png", xi[0].GetProductInfo_Data.ProductID);
                    }
                    if (xi.Count >= 2)
                    {
                        di.Cover2 = xi[1].GetProductInfo_Data.ProductCover;
                        di.Cover2 = string.Format("ms-appdata:///local/CoverImages/{0}.png", xi[1].GetProductInfo_Data.ProductID);
                    }
                    if (xi.Count >= 3)
                    {
                        di.Cover3 = xi[2].GetProductInfo_Data.ProductCover;
                        di.Cover3 = string.Format("ms-appdata:///local/CoverImages/{0}.png", xi[2].GetProductInfo_Data.ProductID);
                    }


ms-resource

使用 ms-resource 配置來參考應用程式資源,這類資源通常是字串資源。

參考來源:http://msdn.microsoft.com/zh-tw/library/windows/apps/jj655406.aspx

如何在 Windows Store App 與 Windows Phone App上,取得裝置上的唯一 ID 代碼

如何在 Windows Store App 與 Windows Phone App上,取得裝置上的唯一 ID 代碼,相信很多在寫App的朋友都會遇到這樣的問題,我這裡整理出這兩個平台取得裝置上唯一ID代碼 ( Device ID)的方法。

Windows Phone

        public static string GetHardwareId()
        {
            string ss = HostInformation.PublisherHostId;
            return ss;
        }

其中您可以參考 MSDN 上的說明 HostInformation.PublisherHostId property

Windows Store ( WinRT )

        /// 
        /// 取得裝置的唯一識別代碼
        /// 
        /// 
        public static string GetHardwareId()
        {
            var _Token = Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null);
            var _Id = _Token.Id;
            var _Reader = Windows.Storage.Streams.DataReader.FromBuffer(_Id);
            var _Bytes = new byte[_Id.Length];
            _Reader.ReadBytes(_Bytes);

            string ss = BitConverter.ToString(_Bytes).Replace("-", "");
            return ss;
        }

其中,在MSDN上的描述為 : HardwareIdentification.GetPackageSpecificToken 取得表示目前硬體的硬體識別項 (ASHWID)。 為每個應用程式封裝傳回的 ASHWID 會不同。換句話說,當這個應用程式開發介面由兩個來自不同封裝的應用程式呼叫時,就會傳回不同的識別項。當同一個封裝的兩個應用程式呼叫它時,它會傳回相同的識別項。

只要7天,一步一步地學會 MVC (Model view controller) 開發技術

光看字面意義,真的滿吸引人的 『Learn MVC (Model view controller) Step by Step in 7 days』,這好像是台灣在賣藥品或者保養品的廣告;只要短短7天,本商品就可以幫助您年輕10歲。

不過,師父領進門,修行在個人,再好的入門文章、技巧、教學影片、課程,若您之後不自己來修練,說真的,還是無效的。

來看看這個作者的前五天的課程規劃

Day 1: -Controllers, strong typed views and helper classes
Day 2: - Unit test, routing and outbound URLS
Day 3:- Partial views, Data annotations,Razor, Authentication and Authorization
Day 4:- JSON, JQuery, State management and Asynch controller
Day 5:- Bundling , Minification , ViewModels,Areas and Exception handling
Day 6: - Display Modes,MVC OAuth,Model Binders,Layout and Custom view engine

真的滿不錯的,若您實際有打開這些課程連結,您就會發現到作者是相當的用心,每天的課程有著 Youtube 的影片,透過影片的學習,快速地聽老師講解一遍,甚至可以看到老師對於範例的操作過程,有助於您對於 ASP.NET MVC 的觀念與作法上的了解。若您聽不太懂英文,真的有些抱歉,因為,這些影片在 Youtube 上沒有提供翻譯字幕。

最後,這是一個值得推薦的 ASP.NET MVC 課程 (免費的喔 )

可來伴奏王 App 的開發心得

去年九月,公司指派了一個案子,可來伴奏王 App ,這是一個 Windows Store 的App,從剛開始接到客戶 RFP & Wireframe 架構圖來看,困難度似乎沒有這麼高,而且 UX 的部分,也是有專門的人原來設計,我們只需要依照設計出來 UX 切圖,套用到這個 Windows Store App上。





事情如果這麼單純就好,如果是這樣,我也就不會從開發可來伴奏王 App的過程中,學習到各種不同的知識與技能,並且應用這些知識和技能,通過了微軟 MCSD:Windows Store Apps 認證;而我會想要去考 MCSD 認證,也是因為開發可來伴奏王 App過程中,發現到要能夠開發出這樣的App,幾乎用到的 WinRT 所提供的 70% 以上的API,也就是說,若您對於 WinRT生態不是十分孰悉,開發起來,必定是痛苦萬翻;不過,也不要擔心,只要您開發出來了,那麼,這些API您也就學會了。

其中這個App會與硬體廠商做到OEM內建機制,這部分也讓我吃足了苦頭,之前也有做過一的Windows Store App,也是與硬體OEM做到內建,幾乎沒有遇到太大的問題,只是一開始 K 文件比較辛苦,可是在伴奏王這個App,OEM硬體廠商卻怎麼也無法預載他們的機器中,最後,只好請微軟的人幫忙研究與分析,原來是專案中有用到資源檔案,他的檔案名稱是中文字,導致無法預載。

而這個App最為複雜的部份,就是媒體撥放器的部分,其中遭遇到了多音軌音樂不同步、音樂游標不同步、手寫筆記、互動撥放等許多功能,整個糾結再一起,說真的,有如脫韁野馬,也有如滔滔江水,綿延不決,導致一發不可收拾;很高興的是客戶相當的有耐心,與我合作一起把問題逐一解決。

當然,未來的文章中,也會將這個專案中的許多不錯的技巧與做法,寫出來與大家分享。

底下是可來伴奏王的功能說明,當然,若您有 Windows 8.1作業系統,您也可以安裝起來使用看看:
說明
「伴奏王」是一個跨世紀的音樂伴奏網絡平臺,也是一個創新的音樂伴奏工具,不論您是音樂初學者、業餘音樂人士、或是專業的演奏家,「伴奏王」能改變您對音樂練習的傳統刻板印象,「伴奏王」將讓您驚豔音樂學習時的豐富樂趣,並獲得實際又有效的練習成果。

音樂學習過程當中最難受的部分就是得忍受自己一人孤單又乏味的練習,想找人一起練習總是喬不定時間,花錢請伴奏又是一筆龐大的開銷。此時,「伴奏王」正是您所需要的音樂產品,一個能讓您隨時帶著走的專業音樂伴奏軟件。

主要功能:
*音樂伴奏 樂在其中
專業製作的高質感音樂伴奏(非一般網絡MIDI品質),讓您的音樂練習不再枯燥乏味。每一個樂器分部都可以獨立開啟與關閉,就像是使用卡拉OK一樣的簡單。如此前所未有的產品體驗,將一舉改變您的練習方式,豐富您的音樂經驗。

*「隨點即播」- 手點到哪 音樂播到哪
電子樂譜移動光標與音樂播放完全同步,無論第幾頁、第幾行或是任一小節,只要手指輕觸屏幕於想要播放的段落點,音樂便會立即跳至點選處並播放音樂,就是這麽簡單!就是這麽神奇!

*節拍器
每一首曲子均可使用音樂互動式的音樂節拍器搭配練習,即使在漸快、漸慢的段落,內建節拍器依然可以讓您輕鬆地跟隨音樂的節奏。

*自動翻頁
您不再需要擔心翻譜的問題!「自動翻頁」的功能會在每一個需要翻頁的地方跳至下一個頁面,包含樂譜上的反覆記號段落。

*樂譜光標指示器
「伴奏王」平臺的樂譜都有光標顯示的功能,光標顯示與音樂播放能完全地同步,如果您對樂曲還不是那麽熟悉,這個功能可以幫助您精準掌握樂曲的進行。當對樂譜有足夠的熟悉度之後,您也可以選擇關閉此功能。

*數位譜紙 多樣選擇
內建數種不同顏色與風格的電子數位譜,豐富您的曲目收藏,建立您的個人風格。

*樂曲搜尋 輕而易舉
使用包括作曲家、類型、風格、樂器種類、難易度、出版社..,等,多樣之交叉組合過濾搜尋方式,能輕鬆的找到您所需要的曲子。

結合全球一流的音樂出版社的專業音樂伴奏產品,「伴奏王」提供您從古典到流行,從爵士到宗教音樂,從初級到專業的音樂演奏需求。我們精心制作最優質的曲目以及最精美的電子樂譜,以提供不同樂器的多樣練習需求。
顯示較多的項目
功能
音樂伴奏 樂在其中
「隨點即播」- 手點到哪 音樂播到哪
內建節拍器
自動翻頁
樂譜游標指示器
數位譜紙 多樣選擇
樂曲搜尋 輕而易舉

芒果優格

住在我們對面的鄰居,他們在台南有種芒果,幾天前我碰到她,問她說現在芒果一斤多少錢? 她說 30元,我想說,好,若您有空,可否幫我送200元左右的芒果給我呢? 她回覆說,好的,下在我回來的時候,會拿給您。其實,我去年也有買,200元買一大袋,真的會吃到撐、吃到爆、吃到膩。

前天,鄰居送來一大袋,當天就用剩下的牛奶,不足的部分加入奶粉,打成了芒果牛奶來喝,冰冰涼涼,身心暢快,真舒服。

今天,要變個花樣,買盒優格回來,打成芒果優格冰沙來喝,酸酸甜甜,又有芒果的清香,晚餐飯後來上一杯,真是人間一大享受呀;不過,優格最好買不加糖的純優格,這樣會比較好喝。

認識許多有載種農產品的朋友,真是一大福氣,隨時都有好吃的蔬果可以享用。

2014/06/24

Visual Studio "14" CTP 與 Azure,讓您立即體驗 VS2014的新功能

微軟最近推出了下一代的Visual Studio版本,代號叫做 Visual Studio “14”,不過,想要體驗與試用這個軟體,要去下載,而且可能會與現在使用的Visual Studio 2013/2012/2010相衝突,又不想自己使用另外一台機器來安裝這樣的環境或者自己建立一個虛擬主機VM。

最近從我的 MSDN所提供的 Azure 服務中,無意間看到了 Azure 的虛擬主機 VM 服務,正好有提供一款虛擬主機,已經幫您準備好了 [Visual Studio 14 CTP 1]的環境,二話不囉嗦,馬上建立起來,看看有甚麼新功能在未來要推出的 Visual Studio 上呢?

首先,進入您的 Azure 服務網頁,選擇[虛擬主機] > [新增],此時會出現如下圖的畫面,請依序選擇 [計算] > [虛擬主機] > [從組件庫] 選項。


在出現 [建立虛擬機器] 的 [選擇映像] 畫面後,捲動可以選擇的虛擬主機映像,您會看到 Visual Studio Professional 14 CTP 1 (Windows Server 2012 R2),請選擇這個項目。

接這設定您的虛擬機器組態,這包含了虛擬機器名稱(自行決定)、層次(我使用標準)、大小(我選擇 A2 (2核心,3.5GB記憶體)、最後請輸入要登入該虛擬機器的帳號與密碼。

在第三個步驟頁面,關於設定值:雲端服務、雲端服務 DNS 名稱、區域/同質群組/虛擬網路、儲存體帳戶、可用性設定組的參數,我都是維持系統預設的。
在最後一個步驟哩,我選擇了不 [安裝 VM 代理程式],這樣就完成了這台虛擬機器的設定,稍帶一段時間,Azure VM 就建立好了。

此時在 Azure 儀表板上,可看到文字:
VulcanVS14 正在啟動 (正在佈建) Windows Azure MSDN - Visual Studio Professional

一旦虛擬主機建置完成後,馬上利用遠端桌面連上這台剛剛建立好的虛擬機器,登入完成後,在桌面,很快地看到了 [Visual Studio 14 CTP] 圖示,想當然耳的,就是馬上打開來瞧瞧囉。

第一次啟動的選擇設定,這部分似乎沒有太多的變化。
接著要稍待一段時間,做第一次的啟動。
不知道為什麼,Visual Studio Professional 14 CTP一定要我做 Sing in的動作,所以,沒有辦法,只好登入到我的 Microsoft Account Live ID了。
Sign in to Visual Studio
Visual Studio will help you play projects, collaborate with your team, and manage your code online from anywhere.

Visual Studio will automatically keep you signed in, sync your settings between devices, and connect to online developer serivces.


登入完成後,接著建立一個新的專案。
不過,觀察了一下,關於 [Store Apps]類型的專案,似乎和 Visual Studio 2013沒有太大的差異,所以,我選擇了 [Web] 類型的專案,接著選擇 [ASP.NET vNext Web Application] ,看看產生了甚麼?

好像沒有看到 Web.config了,所以,我將 config.json & HomeController.cs & Startup.cs 的內容貼出來。

[config.json]
{
    "Data": {
        "DefaultConnection": { 
            "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnetvnext-e3cd9372-49c2-4e9c-b97d-aa146a1185dd;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
    }
}

[Startup.cs]
using System;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Security;
using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Security.Cookies;
using Microsoft.Data.Entity;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using WebApplication1.Models;

namespace WebApplication1
{
    public class Startup
    {
        public void Configure(IBuilder app)
        {
            // Enable Browser Link support
            app.UseBrowserLink();

            // Setup configuration sources
            var configuration = new Configuration();
            configuration.AddJsonFile("config.json");
            configuration.AddEnvironmentVariables();

            // Set up application services
            app.UseServices(services =>
            {
                // Add EF services to the services container
                services.AddEntityFramework()
                    .AddSqlServer();

                // Configure DbContext
                services.SetupOptions(options =>
                {
                    options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
                });
                
                // Add Identity services to the services container
                services.AddIdentity()
                    .AddEntityFramework()
                    .AddHttpSignIn();

                // Add MVC services to the services container
                services.AddMvc();
            });

            // Add static files to the request pipeline
            app.UseStaticFiles();

            // Add cookie-based authentication to the request pipeline
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
            });

            // Add MVC to the request pipeline
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default", 
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" });

                routes.MapRoute(
                    name: "api",
                    template: "{controller}/{id?}");
            });
        }
    }
}

[HomeController.cs]
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

若您有 Microsoft Azure 的帳號,可以馬上來體驗一下,若您沒有的話,那也沒關係,因為您可以馬上申請試用 Azure 服務,試用期間是不用錢的。

微軟 Azure 官方網站

Microsoft Virtual Academy (MVA) 微軟虛擬學院

Microsoft Virtual Academy (MVA) 微軟虛擬學院 是我最喜歡的微軟服務之一,MVA如同學武之人夢寐以求的九陰真經一樣,只要您有上過 MVA的課程,就會深深的愛上他這麼扎實與豐富的課程內容以及在最短的時間內可以讓您有如吃了大補丸一樣,立即越深武林前100大高手。

不過,夢想與現實終究是有些落差的,在MVA的課程內,大部分都是使用英文講解,不過,除了線上直播課程之外,錄影課程大多會有提供翻譯字幕功能;不之是幸還是不幸,大部分的字幕還是英文文字,不過,有些課程,您是可以看到已經翻譯過的中文字幕,相信對於學習是必定是大有助益的;不過,總歸一句話,有機會、有時間、有需要的話,還是要把英文練一下吧。

MVA 內的課程都是該課程內容的專家,並且透過線上影音(直播或者錄影)服務,提供您學習各種微軟相關技術,和蓋了 IT,程式設計,雲端服務等等;最重要的是,這些影音教學服務完全都是免費的,您可以放心大膽的來使用,一次看不懂,在看第二次,必定對於您的專業技術能力會有幫助的。


接下來,我們來了解一下,微軟虛擬學院 MVA 有那些功能與課程可以選擇呢?
想要進入到微軟虛擬學院 MVA,請打開這個網址 www.microsoftvirtualacademy.com ,您就會看到如下圖的畫面,若您還沒有 Microsoft 帳號,記得要去申請一個,並且使用 Micrsofot 帳號登入,如此您才能夠享受到更多的服務與功能。


MVA 中,主要提供了五大區塊功能,摘要說明如下:
[Microsoft Virtual Academy]
MVA的首頁,您可以在這裡透過不同的主題或者產品,來選擇適合您的課程;另外,也可以看到最近有哪些線上直播的課程要推出(在右上角區域,如果有興趣的話,可以點選並且報名參加),另外可以看到您的學習計畫的進度,和整個學院的全球與您所在區域的前三名學生。

[Courses]
您可以選擇不同主題或者產品相關的課程,下圖為我平常有在觀看的 C# / XAML 主題相關課程截圖。

您可以查看您所選擇的主題相關的課程,若您對某個課程有興趣,並且現在無法馬上來學習,可以使用 [Add to My Learning Plan] 將這個課程加入到我的學習計劃清單內,日後您可以從 [My Dashboard] 我的儀表板內,查看到您學習計畫中的準備要參與的課程,進而開始新的課程學習;另外,您也可以看到,每個課程都有列出不同困難度的等級 Level 100 是較入門、簡單的課程,而 Level 300,則是較專業、複雜的課程內容;下圖的每個課程最右邊有塊藍色區域,您會看到不同的點數,這代表了,一旦您參與這個課程,並且聽完了整個課程,就可以獲得多少點數,透過這些學習點數,讓您了解到您在MVA的投入程度,並且可以透過整體學習點數,與其他在 MVA 學院的同學來比較,看看您排名在哪個地方,可以用來激勵您學習力並且獲得一些成就感。


[Live Events]
線上事件,可以讓您看到有哪些準備要推出的線上課程(如下圖 Live Events部分),若您對於這些未來準備要,可以馬上報名,一旦完成報名之後,記得下載該課程的行事曆檔案,並且加入到您的Outlook內,這樣,當課程要開始的時候,就會馬上通知您(不過,您要特別注意,課程上所列出的開始上課時間,是太平洋時區的時間,不是我們台灣這裡的時區時間,您的Outlook可以顯示出不同時間的時間,這樣您就會知道實際開始上課的時間,是台灣這裡的幾月幾號幾點鐘;大部分的線上直播課程,大多是我們台灣時間的凌晨 0:0開始。

另外,若您來不急參加線上直播課程,但您想要學這這門課程,您也不用擔心,在下圖的 [Recorded Events] 清單內,您會看到有那些課程已經準備好錄影課程(通常線上直播課程結束之後的兩個星期之後,就會有該課程的錄影課程推出);選擇錄影課程有另外一個好處,那就是會有字幕出現,有些課程,會有繁體中文的翻譯字幕,是個相當貼心的服務。



[My Dashboard]
我的儀錶板,我特別喜歡這個功能,因為,我可以透過 [我的儀表板] 功能,自行調整那些課程學習進度、是否某些課程要優先學習(可以使用滑鼠點擊 上下三角形 區域,拖拉到適當的位置),

[Redeem your vouchers] 兌換優惠券功能,可以立即獲得50點左右的MVA積分,獲得方式也相當的容易,只要您有參加線上直播課程,在 [FAQ] 頁次中,您會看到這個課程的優惠劵代碼,將這個代碼複製下來,到我的儀表板頁面中,點選 [Redeem your vouchers] 兌換優惠券,並且貼上該優惠劵代碼,您就馬上可以獲得積分做為您參加線上課程的獎勵;整體的學習課程的積分會顯示在我的儀表板頁面的右上方;最重要的是,整體積分只是讓您知道您已經付出了多少努力,並沒有任何其他的意義,千萬不要為了衝積分,而做些不好的動作,這樣,反而失去了您參加 MVA活動的意義了。



[Top Students]
最優秀的學生頁面提供了全球與您所在地區的MAV學生,學習與參與度排行榜,您可以查看到 每週 (WEEKLY),每月 (MONTHLY),與累計到現在為止(ALL TIME)的學習積分排名,過高的分數都是代表的不正常的使用MVA系統,因為,這些人並沒有實際在參與、學習 MVA內的課程,完全只是在衝MVA積分;實際上,我們是要能夠透過 MVA 所提供給我們的豐富的課程,提升我們自己的能力,讓我們可以擁有更強大的競爭實力,而經過一年多來的使用與參與 MVA課程(我大多參與C# XAML ASP.NET MVC AZURE 與程式設計有關的課程),真的讓我受益匪淺,而且只要持之以恆的不斷聽 MVA 的各種課程,您的專業能力也在無形中的提升中,這就如同武俠小說中,練習內功一樣,持續修練,一旦到某個程度,您的任督二脈打通之後,您就可以擠身在武林高手之列了(當然,您也可以像我一樣,做個身居深山的傳道者)。


另外,您也可以查看 MVA 某個同學的背景與學習內容,從這裡您也許會看到有些不錯的課程,也是您想要參加的。


結論:從事 IT 行業是條不歸路,我個人是因為這是我有興趣的事情,所以,在從事這些工作的時候,並不會覺得有甚麼不適應;不過,IT業界如同時尚圈一樣,需要我們不斷的在不同時間來充實各種新知識,這樣,才不會被流行的事物給擊敗,因此,唯有不斷的學習與從工作中獲得各種實戰經驗,方可持續對您進行充電。

使用 Windows Phone 的 Facebook App 於寫狀態內容的時候,需要標記好友且好友名字為中文字的作法

當您在使用 Windows Phone 手機,打開 Facebook App,並且要寫最新狀態內容文字的時候,突然想要標記這段文字,指名您的某個 Facebook 好友;不過,若您的好友在Facebook顯示的是中文名字,此如若您輸入 @ 接著使用注音輸入法打入您好有名字的時候,卻發現無法看到自動如下圖紅色框線所標示的您的好友,當然,這個時候,您就無法透過 Facebook App 來標示您的好友了。


若想要解決此一問題,您有兩個做法,一個是使用手寫輸入法,另外一個是使用一般輸入法(如注音輸入法),不過,若您選擇後者的話,需要多幾個步驟要做。


【使用手寫輸入法】


若您的Windows phone 手機上還沒有手寫輸入法,請依照底下說明,啟用手寫輸入法。
》 點選 [設定] 功能,並且選擇 [鍵盤] 選項。
》 在 [設定] >[鍵盤] 畫面中,選擇 [新增鍵盤] 選項
》在 [新增鍵盤] 畫面中,選擇 [中文(繁體) - 手寫] 選項,並且點選最下方的 [確定] 按鈕。
》此時,您剛剛選擇的 中文(繁體) - 手寫 鍵盤就已經可以在您的Windows Phone手機上使用了。

》這個時候,您可以開啟您手機中的 Facebook App,並且點選應用程式列的 [狀態] 按鈕,開始進行輸入您最新的 Facebook 狀態;當您輸入完成您的最新狀態文字之後,可以輸入小老鼠符號 @ 接著,使用手寫輸入法,輸入您好友的名字(姓氏可以不用輸入),如下圖左上方的紅色方塊區域,我們輸入了 @大雅 有好康在這裡,表示想要通知好友 大雅 我的最新狀態。

   接著,請在您的手寫輸入法面板的左下方,如下圖的左下方紅色區域,點選 [繁] 這個按鈕。


》神奇的是,您就會看到您的 Facebook App,可以讓您選擇您好友中,所有 大雅 的好友名單,只要點選您要通知的好友項目,就完成了在寫入最新Facebook狀態內容的時候,也順便標示給您的好友。

在下圖中,我們看到我們要標示的好友為 @大雅,而Facebook App幫我找到了 李大雅 這個好友,我們點選這個好友。

就完成了在寫最新狀態的時候,順便標示好友的需求。

【使用一般輸入法】
接下來的做法,我們不需透過 手寫輸入法 ,也可以做到在更新最新狀態的時候,也可以標示好友的操作方式。

》我們在這裡使用注音輸入法作為示範,我們開啟 Facebook App,並且進入到要寫一個新的Facebook最新狀態的頁面中;接著,把我們要更新的最新狀態文字與需要標示的好友名字都寫出來(記得,只要寫好友的名字,不需要寫全名)。
》接下來,在您的好友名字前面,輸入 小老鼠 符號 @
》這個時候,請將輸入法面板關閉起來,也就是按一下手機上的回上一頁按鈕(通常位於手機顯示面板的最左下方,有個往左的箭頭符號地方)。
》這個步驟也是最神奇的操作,此時,您需要重新點選到您剛剛寫的最新狀態中的任何文字,讓文字輸入法面板可以顯示出來;不過,此時若您還是看不到如下圖畫面中紅色方塊處,您好友的資訊,請切換到英文字的輸入面板(您可以點選左下角的 [繁] 這個文字即可。

神奇的現象發生了,您就會看到您好友的資訊,原來,在注音輸入法的面板中,原本要顯示您好友的資訊的地方,被注音輸入法的智慧提示輸入文字給佔據了,所以,您會看不到您好友的資訊,只要切換到英文輸入面板,就可以看到囉。

若您點選到的文字是英文字,您可切換到數字輸入面板(輸入法面板的左下方的 [&123] 區域,點下去,就可以切換到數字輸入面板了)。

有了這個密技,下次您使用Facebook App就可以在更新您最新狀態文字內容的時候,也可以順便標示您的好友。

在 Windows Phone 多語系應用程式工具組

在您開發 Windows Phone & Windows Store (WinRT) App的時候,若您的App可以支援兩個以上的多國語言文字,必定可以有全球更多的人來認識、安裝、使用,甚至購買您的App;以往要做多國語言支援的時候,需要維護不同語言的資源檔案 .resw,處理起來相當的麻煩,而且,針對不同語系的文字,都需要自己來處理與更新這些文字的翻譯問題。

自從有了 [多語系應用程式工具組] ,這一切的夢厭都隨之煙消雲散了,透過了 [多語系應用程式工具組] ,您可以維護一組語言文字資源,其他的都透過 [多語系應用程式工具組] 幫您來處以,也可協助您使用 Bing 的翻譯工具,自動的翻譯成為不同語系文字,最重要的是,這都是免費的。

最令我激賞的是,這套 [多語系應用程式工具組] 可以支援 Windows Phone & WinRT 的App。

適用於 Visual Studio 2012 的多語系應用程式工具組

一步一腳印:一次只做一件專精的事情,並且把它做到好

這兩年重新回到了程式設計的工作領域,其實,這是我最喜歡的工作,因為,累積了許多經驗、看過許多書;不過,也許是十多年沒有接觸這方面領域,而且各方面的技術也都不斷地進步,所以,我決定回到我最孰悉的範圍,那就是 WinRT / Windows Phone App開發方面(主要針對 C# / XAML),將這兩年的一些經驗與別人經常問到的問題,透過各種不同的小Lab,說明這些需求要如何做到。

當然,首先工作,就是要蒐集那些主題是我要來寫作的對象,我想應該用一個星期的時間,可以不斷地蒐集所要寫作的主題,所以,實際的文章內容,將會從7月1日起,開始陸續寫出來。

一步一腳印,步步要扎實,過慢與過快都不是很好的,穩健地踏出第一步,之後的影色是您所無法想像的美麗。

經過 保哥 指點,我終於學會了如何使用 SyntaxHighLighter 高亮程式碼 在Google Blogger使用方法








    
        
            

                
                
            

        
    

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// 空白應用程式範本已記錄在 http://go.microsoft.com/fwlink/?LinkId=234227

namespace GridViewTest
{
    /// 
    /// 提供應用程式專屬行為以補充預設的應用程式類別。
    /// 
    sealed partial class App : Application
    {
        /// 
        /// 初始化單一應用程式物件。這是第一行執行之撰寫程式碼,
        /// 而且其邏輯相當於 main() 或 WinMain()。
        /// 
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// 
        /// 在應用程式由使用者正常啟動時叫用。其他進入點
        /// 將在啟動應用程式以開啟特定檔案時使用,以顯示
        /// 搜尋結果等。
        /// 
        /// 關於啟動要求和處理序的詳細資料。
        protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // 當視窗已經有內容時,不重複應用程式初始化,
            // 只確定視窗是作用中
            if (rootFrame == null)
            {
                // 建立框架做為巡覽內容,並巡覽至第一頁
                rootFrame = new Frame();

                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: 從之前暫停的應用程式載入狀態
                }

                // 將框架放在目前視窗中
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                // 在巡覽堆疊未還原時,巡覽至第一頁,
                // 設定新的頁面,方式是透過傳遞必要資訊做為巡覽
                // 參數
                if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
                {
                    throw new Exception("Failed to create initial page");
                }
            }
            // 確定目前視窗是作用中
            Window.Current.Activate();
        }

        /// 
        /// 在應用程式暫停執行時叫用。應用程式狀態會儲存起來,
        /// 但不知道應用程式即將結束或繼續,而且仍將記憶體
        /// 的內容保持不變。
        /// 
        /// 暫停之要求的來源。
        /// 有關暫停之要求的詳細資料。
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: 儲存應用程式狀態,並停止任何背景活動
            deferral.Complete();
        }
    }
}
SyntaxHighLighter 3.0.83 高亮程式碼 在Google Blogger使用方法