Thứ Hai, 17 tháng 10, 2016

MVC Model: Xây dựng chương trình MVC5 - CRUD Product

  Không có nhận xét nào
11:50

MVC Model "trông như thế nào" ?


MVC là viết tắt của Model – View – Controller. Là một kiến trúc phần mềm hay mô hình thiết kế được sử dụng trong kỹ thuật phần mềm. Nói cho dễ hiểu, nó là mô hình phân bố source code thành 3 phần, mỗi thành phần có một nhiệm vụ riêng biệt và độc lập với các thành phần khác nhau.


Trong đó:
Models: Các đối tượng Models là một phần của ứng dụng, các đối tượng này thiết lập logic của phần dữ liệu của ứng dụng. Thông thường, các đối tượng model lấy và lưu trạng thái của model trong CSDL. Ví dụ như, một đối tượng Product (sản phẩm) sẽ lấy dữ liệu từ CSDL, thao tác trên dữ liệu và sẽ cập nhật dữ liệu trở lại vào bảng Products ở SQL Server.

Views: Views là các thành phần dùng để hiển thị giao diện người dùng (UI). Thông thường, view được tạo dựa vào thông tin dữ liệu model. Ví dụ như, view dùng để cập nhật bảng Products sẽ hiển thị các hộp văn bản, drop-down list, và các check box dựa trên trạng thái hiện tại của một đối tượng Product.

Controllers: Controller là các thành phần dùng để quản lý tương tác người dùng, làm việc với model và chọn view để hiển thị giao diện người dùng. Trong một ứng dụng MVC, view chỉ được dùng để hiển thị thông tin, controller chịu trách nhiệm quản lý và đáp trả nội dung người dùng nhập và tương tác với người dùng. Ví dụ, controller sẽ quản lý các dữ liệu người dùng gởi lên (query-string values) và gởi các giá trị đó đến model, model sẽ lấy dữ liệu từ CSDL nhờ vào các giá trị này.

Tại sao lại dùng nó?

Sự nhập nhằng giữa giao diện và code trong các ngôn ngữ lập trình Scripting như JSP, PHP, ASP làm cho code chương trình khó hiểu và khó bảo trì và khó hình dung trong quá trình cài đặt hệ thống từ góc nhìn thiết kế. Từ đó MVC ra đời với mục tiêu khắc phục những vấn đề đó. Bạn sẽ thấy rõ hơn trong các phần tiếp theo khi chúng ta tiến hành áp dụng MVC để xây dựng ứng dụng.

MVC có thể dùng trên Desktop, tuy nhiên trên mô hình ứng dụng Web thì ưu điểm của nó mới được thể hiện rõ ràng hơn.

Nó làm việc ra sao?

Chắc dựa vào hình ảnh ở đầu bài bạn cũng phần nào hình dung ra rồi, cụ thể nó là:
- User tương tác với View, bằng cách click vào button, link,.. user gửi yêu cầu đi..
- Controller nhận và điều hướng chúng đến đúng phương thức xử lý ở Model.
- Model nhận thông tin và thực thi các yêu cầu, tương tác với database.
- Khi Model hoàn tất việc xử lý, View sẽ nhận kết quả từ Model và hiển thị lại cho người dùng.

Xây dựng ứng dụng MVC5 - CRUD Product


Nói lý thuyết suông hoài chắc cũng nản, ta quay ra code thư giãn nhé :)))

Bài này thì mình sẽ không có code mẫu, hay ảnh chụp màn hình nữa.. vì nó quá dài về mặt thao tác (chứ code chả đáng bao). Các bạn chịu khó tự xem tự làm theo video hướng dẫn của thầy Nguyễn Tuân nhé :)


Bài trên là sử dụng ASP.NET MVC, có nó là cái gì thì làm xong đi rồi ta quay lại lý thuyết ở dưới :)

ASP.NET MVC là gì?


ASP.NET là một nền tảng ứng dụng web (web application framework) được phát triển và cung cấp bởi Microsoft, cho phép những người lập trình tạo ra những trang web động, những ứng dụng web và những dịch vụ web.

ASP.NET MVC là một framework tuyệt vời hỗ trợ pattern MVC cho ASP.NET. Nền tảng ASP.NET MVC giúp cho chúng ta có thể tạo được các ứng dụng web áp dụng mô hình MVC thay vì tạo ứng dụng theo mẫu ASP.NET Web Forsm. Nền tảng ASP.NET MVC có đặc điểm nổi bật là nhẹ (lighweigt), dễ kiểm thử phần giao diện (so với ứng dụng Web Forms), tích hợp các tính năng có sẵn của ASP.NET.

Tạo sao nên dùng ASP.NET MVC?

Bạn nên sử dụng ASP.NET MVC framework cho việc tạo ra các ứng dụng web vì những lý do được liệt kê sau đây:

SoC
Một trong những lợi ích chính được đưa ra bởi ASP.NET MVC đó là Separation of Concern (phân tách mối bận tâm). Framework này cung cấp sự phân tách rất rõ gàng giữa model, logic nghiệp vụ, giao diện người dùng và dữ liệu.

Control
Khi bạn sử dụng framework ASP.NET MVC, bạn được cung cấp một bộ control rất mạnh mẽ trên JavaScript, HTML và CSS so với các control được cung cấp bởi một số hình thức truyền thống trên web.

Có khả năng kiểm thử
Học lập trình web trực tuyến bằng ASP.NET MVCFramework ASP.NET MVC hỗ trợ việc kiểm thử các ứng dụng web rất tốt. Vì vậy, nếu bạn muốn kiểm thử ứng dụng web của mình trước khi đưa chúng cho người sử dụng, bạn có thể chỉ cần sử dụng ASP.NET MVC.

Gọn nhẹ
Framework này không sử dụng View State, hỗ trợ bạn trong việc làm giảm băng thông của các request rất nhiều. Nhiều chuyên gia khuyên bạn nên sử dụng framework này nếu bạn quan tâm đến việc tạo ra các ứng dụng MVC tuyệt vời và hữu ích dựa trên web.

View và Size của Control
Các framework ASP.NET thường phải đối mặt với vấn đề của view state và kích thước của control trong HTML. Phần view lưu toàn bộ dữ liệu đã được rendered và do đó kích thước các tập tin HTML trở nên lớn hơn. Nếu bạn sử dụng một đường kết nối internet chậm, bạn sẽ quan sát thấy độ trễ trong việc tải các trang web và ứng dụng. Vấn đề này không còn tồn tại trong framework ASP.NET MVC cũng như nó không chứa một khái niệm về view ở trong đó. Bằng cách sử dụng ASP.NET MVC, bạn sẽ không còn phải đối mặt với các vấn đề về thời gian tải trang nữa.

Tích hợp
Khi bạn tích hợp MVC với jQuery, bạn có thể viết code của mình chạy trong các trình duyệt web. Điều này sẽ giúp giảm tải cho các web server của bạn.

Khả năng sử dụng
Bạn không cần phải có nhiều kiến ​​thức kỹ thuật khi sử dụng framework ASP.NET MVC. Tuy nhiên, bạn sẽ thích nó sau khi học được cách làm cho nó hoạt động. Framework này tốt hơn rất nhiều so với nhiều hình thức trang web khác. Lý do là nó hoạt động khá gần với các chiến lược làm việc của web và được coi là khá dễ dàng và thú vị để sử dụng.

API Services
Một lợi thế lớn khác đó là việc rendered bởi MVC giúp bổ sung thêm các API web services. Nếu bạn muốn thêm các service tới ứng dụng web của mình, thì bạn chắc chắn cần phải tìm hiểu làm thế nào những service này hoạt động.


Tài liệu tham khảo


Có lẽ không tài liệu nào đầy đủ và hoàn thiện hơn là người đã tạo ra nó :)))
- Learn About ASP.NET MVC - Microsoft
- Introduction to ASP.NET MVC - Microsoft visual academy

Xem thêm

Thứ Sáu, 23 tháng 9, 2016

Diagnosing Problems và Monitoring Applications trong VisualStudio

  2 nhận xét
11:32

Nội dung chính

Biết các chuẩn đoán vấn đề và giám sát ứng dụng trong VisualStudio

Hướng dẫn chi tiết


Chúng ta sẽ tiếp tục ở bài trước, hoặc bất kì app nào bạn muốn. Nhưng ở đây mình tiếp tực thực hiện trên project cũ Securing Windows Store App Data (SWSA)

Chọn Debug - > Performance Profiler (hoặc ấn Alt+F2)


Tiếp theo, tích ô CPU Usage và chọn Start để bắt đầu cho việc chuẩn đoán vấn đề của ứng dụng.


Nó sẽ hiện ra quá trình thực thi, tuần suất, băng thông,.. về CPU. Bạn chọn Create detailed report, để suất ra file báo các


Chọn Export report data


Nó hiện ra 1 cửa sổ, bạn chọn những thứ cần lấy sau đó nhấn Export


Kết quả sẽ là file .csv như bạn thấy :)


Nội dung tham khảo

- Windows Store App - Diagnose/Debug Printing Issue (PrintTaskCompletion.Failed)

Xem thêm

Securing Windows Store App Data (SWSA)

  Không có nhận xét nào
11:07

Khái niệm

Là kỹ thuật mã hóa/giải mã dữ liệu trong việc bảo mật dữ liệu ứng dụng Windows Store.

Hướng dẫn

Tạo project mới có tên EncryptDecrytDemo:


Mở MainPage.xaml ra, code theo hình:

Copy/paste:
<Page
x:Class="EncryptDecrytDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:EncryptDecrytDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock FontSize="40" Text="Encrypt Decrypt Demo" Margin="450,60,475,650" Height="60" Width="450"/>
<TextBlock FontSize="20" Text="Plain Text" Margin="395,225,825,505"/>
<TextBlock FontSize="20" Text="Encrypted Value" Margin="396,315,825,414" />
<TextBlock x:Name ="txtEncrypt" FontSize="20" Margin="567,315,199,399" Width="600"/>
<TextBlock FontSize="20" Text="Decrypted Value" Margin="396,403,825,329"/>
<TextBlock x:Name ="txtDecrypted" FontSize="20" Margin="567,402,199,329" Width="600"/>
<TextBox x:Name="txtText" FontSize="20" Margin="603,221,386,505" Width="377"/>
<Button Content="Submit" Margin="600,475,0,255" Click="Button_Click"/>
</Grid>
</Page>

Hãy đảm bảo rằng khi code xong design nó sẽ trông ntn :)


Mở MainPage.xaml.cs để code xử lý:

Copy/paste:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
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;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace EncryptDecrytDemo
{
///

/// An empty page that can be used on its own or navigated to within a Frame.
///

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
public static byte[] Encrypt(string plainText, string pw, string sult)
{
IBuffer pwBuffer = CryptographicBuffer.ConvertStringToBinary(pw, BinaryStringEncoding.Utf8);
IBuffer sultBuffer = CryptographicBuffer.ConvertStringToBinary(sult, BinaryStringEncoding.Utf16LE);
IBuffer plainBuffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf16LE);
KeyDerivationAlgorithmProvider key = KeyDerivationAlgorithmProvider.OpenAlgorithm("PBKDF2_SHA1");
KeyDerivationParameters parm = KeyDerivationParameters.BuildForPbkdf2(sultBuffer, 1000);
CryptographicKey ckey = key.CreateKey(pwBuffer);
IBuffer keyMaterial = CryptographicEngine.DeriveKeyMaterial(ckey, parm, 32);
CryptographicKey dkey = key.CreateKey(pwBuffer);
IBuffer sulltMaterial = CryptographicEngine.DeriveKeyMaterial(dkey, parm, 16);
SymmetricKeyAlgorithmProvider sp = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7");
CryptographicKey symKey = sp.CreateSymmetricKey(keyMaterial);
IBuffer resultBuffer = CryptographicEngine.Encrypt(symKey, plainBuffer, sulltMaterial);
byte[] result;
CryptographicBuffer.CopyToByteArray(resultBuffer, out result);
return result;
}
public static string Decrypt(byte[] encryptval, string pw, string salt)
{
IBuffer pwBuffer = CryptographicBuffer.ConvertStringToBinary(pw, BinaryStringEncoding.Utf8);
IBuffer saltBuffer = CryptographicBuffer.ConvertStringToBinary(salt, BinaryStringEncoding.Utf16LE);
IBuffer cipherBuffer = CryptographicBuffer.CreateFromByteArray(encryptval);
KeyDerivationAlgorithmProvider key = KeyDerivationAlgorithmProvider.OpenAlgorithm("PBKDF2_SHA1");
KeyDerivationParameters parm = KeyDerivationParameters.BuildForPbkdf2(saltBuffer, 1000);
CryptographicKey ckey = key.CreateKey(pwBuffer);
IBuffer keyMaterial = CryptographicEngine.DeriveKeyMaterial(ckey, parm, 32);
CryptographicKey dkey = key.CreateKey(pwBuffer);
IBuffer saltMaterial = CryptographicEngine.DeriveKeyMaterial(ckey, parm, 16);
SymmetricKeyAlgorithmProvider sp = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7");
CryptographicKey symmKey = sp.CreateSymmetricKey(keyMaterial);
IBuffer resultBuffer = CryptographicEngine.Decrypt(symmKey, cipherBuffer, saltMaterial);
string result = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf16LE, resultBuffer);
return result;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
byte[] encrypt;
encrypt = Encrypt(txtText.Text, "pw", "salt");
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
txtEncrypt.Text = encoding.GetString(encrypt, 0, encrypt.Count());
txtDecrypted.Text = Decrypt(encrypt, "pw", "salt");
}
}
}


Test app vừa tạo nào :)



Tổng kết

- Qua ví dụ trên, chúng ta đã được biết cách mã hóa/giải mã kí tự đơn giản bằng Encoding Utf-8 và Utf16LE.

Nội dung tham khảo

- Mã hoá chuỗi trong C#
- Encrypting and Decrypting trên MSDN

Xem thêm

Managing Windows & Web Authentication (MW&WA)

  Không có nhận xét nào
10:50

Hướng dẫn code


Tạo project mới có tên ContactLive:


Mở MainPage.xaml ra code giao diện :)

Copy/paste
<Page
x:Class="ConnectLive.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ConnectLive"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Page.Resources>
<DataTemplate x:Key="contactTemp">
<Grid Width="600" Height="300">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="75"></RowDefinition>
<RowDefinition Height="75"></RowDefinition>
<RowDefinition Height="75"></RowDefinition>
<RowDefinition Height="75"></RowDefinition>

</Grid.RowDefinitions>
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding ContactName}"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Contact Number" Visibility="{Binding CanShow}"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Email" Visibility="{Binding CanShow}"/>
<TextBlock Grid.Column="0" Grid.Row="3" Text="Image"/>
<ListBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding PhoneNumber}" Visibility="{Binding CanShow}"></ListBox>
<ListBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding ContactEmails}" Visibility="{Binding CanShow}"></ListBox>
<Image Grid.Column="1" Grid.Row="3" Source="{Binding ContactImage}"/>
</Grid>
</DataTemplate>
</Page.Resources>
<Grid Background="ForestGreen">
<Button x:Name="btnContact" Content="View Contact" Margin="50,75,0,650" Click="btnContact_Click"/>
<ListView x:Name="lstContact" Margin="600,80,90,90" ItemTemplate="{StaticResource contactTemp}"/>
</Grid>
</Page>

Đảm bảo rằng khi code xong design sẽ trông như thế này:



Mở MainPage.xaml.cs ra code phần xử lý:

Copy/paste
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel.Contacts;
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.Media.Imaging;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace ConnectLive
{
///

/// An empty page that can be used on its own or navigated to within a Frame.
///

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}

List s;
public List Details { get { return s; } set { s = value; } }

private async void btnContact_Click(object sender, RoutedEventArgs e)
{
Details = new List();
var p = new ContactPicker();
p.CommitButtonText = "Pick Contact";
var selectedContact = await p.PickSingleContactAsync();
Details.Add(new ContactDetails(selectedContact));
lstContact.ItemsSource = Details;
}


public class ContactDetails
{
public string ContactName { get; private set; }
public BitmapImage ContactImage { get; private set; }
public Visibility CanShow { get; set; }
public List PhoneNumbers { get; set; }
public List ContactEmails { get; set; }

public ContactDetails(ContactInformation c)
{
PhoneNumbers = new List();
ContactEmails = new List();
CanShow = Visibility.Visible;
ContactName = c.Name;
foreach (var item in c.PhoneNumbers)
PhoneNumbers.Add(item.Value);
foreach (var item in c.Emails)
ContactEmails.Add(item.Value);
}
}
}
}

Run thôi:






Nhận xét

- Qua ví dụ trên, chúng ta đã được biết cách quản lí ứng dụng People có sẵn của Windows và cách lấy thông tin từ nó. Trong thực tế ta cần lấy những thông tin ứng dụng hệ thống rất nhiều thứ...v.v

Nội dung tham khảo

- Windows.ApplicationModel.Contacts namespace
- Managing application data in a Windows Store business app using C#, XAML, and Prism

Xem thêm

Thứ Tư, 21 tháng 9, 2016

Kiếm tiền trong Windows Store: Time Based Trial

  Không có nhận xét nào
07:54

Làm sao để kiếm tiền từ việc viết ứng dụng có lẽ đó là điều mà bất cứ nhà phát triển ứng dụng nào cũng quan tâm. Và ở bài viết này mình sẽ chỉ các bạn cách kiếm tiền từ Windows Store (chợ ứng dụng của Windows).
Windows Store cung cấp 3 cách thức kiếm tiền cho các nhà phát triển (mình chỉ nói windows hỗ trợ nhà phát triển, không đề cập đến việc sử dụng quảng cáo bên thứ 3):

1, Buy (Trả phí để tải về)
2, Time-Based Trials (Dùng thử trước, quyết định trả phí sau)
3, In-app Purchase (Mua item, modul trong trong app)
4, Nhúng quảng cáo (http://pubcenter.microsoft.com - Doanh thu dựa trên cách thông số CPM, CPC, CPA,..)


Như tiêu đề, trong bài viết này mình sẽ chỉ đi sâu đề cập đến cách thức số 2: Time-Based Trial

1, Time-Based Trials "trông như thế nào"?


Trong thực tế bạn sẽ gặp khá nhiều ứng dạng "trả sau" này, đa phần là ứng dụng tiện ích, công cụ như: Phần mềm diệt virut; tool edit video, music; office;...
Nhà phát triển sẽ cho người dùng dùng thử một khoảng thời gian nhất định để người dùng vừa đủ thời gian để trải nghiệm ứng dụng, để cho người dùng thấy ứng dụng đem lại lợi ích như thế nào, có đáng để người dùng trả phí mua ứng dụng hay không (Đôi khi sẽ là tạo thói quen cho người dùng, để người dùng quen với việc sử dụng ứng dụng và dễ dàng chấp nhận bỏ tiền hơn :))

2, Time-Based Trials trong Windows Store


Để tạo một ứng dụng Time-Based Trials, nhà phát triển có thể thiết lập một cơ chế tính toán thời gian hay ngày trong ứng dụng. Windows Store sẽ tính toán thời gian sử dụng ứng dụng cũng như kết thúc giai đoạn dùng thử. Khi gửi các ứng dụng lên cửa hàng các nhà phát triển đã chỉ định thời gian thử nghiệm cho các ứng dụng như minh hoạ như hình dưới. Thời gian dùng thử sẽ bắt đầu tính khi người dùng tải về và cài đặt.
Các ứng dụng từ cửa hàng. Khi thử nghiệm hết hạn, Windows Store sẽ tự động nhắc người dùng phải trả tiền cho các ứng dụng nếu anh/chị ấy mong muốn tiếp tục sử dụng các ứng dụng hoặc ứng dụng sẽ ngừng thực hiện hoạt động.

3, Tạo ứng dụng


Nếu bạn chưa có project nào mới thì điều đầu tiên là tạo project mới rồi, hay tốt nhất với người mới nên là vậy. Nó sẽ giúp bạn dễ hiều hơn cũng như code minh bạch, rõ ràng hơn :)

Mở MainPage.xaml ra, code theo hình dưới:
Tool Ctrl+C, Ctrl+V :)

<Page
x:Class="TrialApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TrialApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock FontSize="25" Text="Licensing App" Margin="606,117,544,608"/>
<TextBlock x:Name="txtDetail" FontSize="20" Margin="398,172,402,453"/>
<Button x:Name="btnPurchase" Content="Purchase" Margin="536,372,0,358" Click="btnCalculate_Click"/>
<Button x:Name="btnCalulate" Content="Details" Margin="705,372,0,358" Click="btnDetails_Click"/>
</Grid>
</Page>


Đảm bảo rằng khi code xong design nó sẽ ra ntn, nếu không hãy thay bàn phím :))

Tạo một thư mục có tên Data, trong thư mục tạo 1 file xml có tên StoreLicense.xml.. Lưu ý là thư mục Data phải ngang hàng với MainPage.xaml, mục Assets,.. nhé


Trong file StoreLicense.xml:
Copy, paste
<?xml version="1.0" encoding="utf-8" ?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>00000000-0000-0000-0000-000000000000</AppId>
<LinkUri>
http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000
</LinkUri>
<CurrentMarket>en-US</CurrentMarket>
<AgeRating>3</AgeRating>
<MarketData xml:lang="en-us">
<Name>LicenseTest</Name>
<Description>Will check the license info</Description>
<Price>10.00</Price>
<CurrencySymbol>$</CurrencySymbol>
<CurrencyCode>USD</CurrencyCode>
</MarketData>
</App>
<Product ProductId="1" LicenseDuration="0">
<MarketData xml:lang="en-us">
<Name>License App</Name>
<Price>1.00</Price>
<CurrencySymbol>$</CurrencySymbol>
<CurrencyCode>USD</CurrencyCode>
</MarketData>
</Product>
</ListingInformation>
<LicenseInformation>
<App>
<IsActive>true</IsActive>
<IsTrial>true</IsTrial>
<ExpirationDate>2016-10-01T00:00:00.00Z</ExpirationDate>
</App>
<Product ProductId="1">
<IsActive>true</IsActive>
</Product>
</LicenseInformation>
</CurrentApp>


Tiếp theo trong MainPage.xaml.cs bạn code phần tính toán thời gian, sự kiện button,..
Tool:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Store;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Storage;
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;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace TrialApp
{
///


/// An empty page that can be used on its own or navigated to within a Frame.
///

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async System.Threading.Tasks.Task fnLoadLicenseInfo()
{
StorageFolder proxyDataFolder = await Package.Current.InstalledLocation.
GetFolderAsync("Data");
StorageFile proxyFile = await proxyDataFolder.GetFileAsync("StoreLicense.xml");
await CurrentAppSimulator.ReloadSimulatorAsync(proxyFile);
}
private void btnCalculate_Click(object sender, RoutedEventArgs e)
{
if (CurrentAppSimulator.LicenseInformation.IsTrial)
{
txtDetail.Text = "Trial License";
}
}
private async void btnDetails_Click(object sender, RoutedEventArgs e)
{
LicenseInformation l = CurrentAppSimulator.LicenseInformation;
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
txtDetail.Text = "Trial License.\n";
var r = (l.ExpirationDate - DateTime.Now).Days;
txtDetail.Text += String.Format("Remaining day: {1}", l.ExpirationDate, r );
});
}
}
}

Giờ thưởng thức thành quả nào :)
Khi click vô nút Purchase.
Nút Details, báo thời gian dùng thử còn lại:


4, Tài liệu tham khảo


- Implement a trial version of your app
- Making money with your apps through the Windows Store
- App promotion and customer engagement
Video hướng dẫn bởi Mr.Tuân :)

Xem thêm

Thứ Sáu, 16 tháng 9, 2016

Device Capabilities trong Windows Store App Development

  Không có nhận xét nào
20:39

Ở bài này mình sẽ hướng dẫn các bạn tạo app có tên DeviceTesting, mục đích app này sẽ là kiểm tra có hay không Device Printer, nếu có thì hiện ra danh sách (ID, tên, tình trạng kết nối) nhờ Windows.Devices.Enumeration API.

1, Device là gì?


Device là toàn bộ các thiết bị phần cứng được hoặc chưa được nhận diện, cụ thể ở đây là trong Windows. Ví dụ như: chuột, camera, keyboard, card wifi, ram, cpu, screen,..

2, Enumerating Devices


Windows.Devices.Enumeration và Windows.Devices.Enumeration.Pnp là 2 namespaces liệt kê các device được kết nối hoặc ngắt kết nối. Windows.Devices.Enumeration cung cấp hai phương pháp, cụ thể là FindAllAsync và CreateWatcher để liệt kêê các device.

- FindAllAsync: tìm kiếm điện thoại chỉ một lần thiết bị được kết nối. Điều này sẽ không cập nhật được bất cứ khi nào người dùng thêm hoặc xóa các device

- CreateWatcher: luôn luôn cập nhật và liệt kê các thiết bị bằng cách đẩy thông báo, như người dùng thêm hoặc bỏ các device.

3, Code thôi


Đầu tiên tạo một project rồi.

Mở MainPage.xaml ra code theo hình :)

Lười thì tool copy, paste :))
<Page
x:Class="DeviceTesting.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:DeviceTesting"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<grid Background="Black" x:Name="ContentRoot" Margin="0,25,-29,20">
<textblock FontSize="15" Text="Select Device" Margin="145,25,800,675"/>
<textblock FontSize="15" Text="Class GUID:" Margin="145,175,850,525"/>
<textblock FontSize="15" Name="txtResult" Foreground="White" Margin="379,309,465,383"/>
<listbox Name="lstDevices" Width="400" Margin="375,10,400,600">
<listboxitem Name="WebCam" Content="WebCam"/>
<listboxitem Name="PortDevices" Content="PortDevices"/>
<listboxitem Name="Printer" Content="Printer"/>
</ListBox>
<textblock Name="txtClassGuid" Margin="375,160,400,525"/>
<button Name="btnEnumerate" Content="Enumerate" Margin="375,240,0,438" Click="btnEnumerate_Click" Height="45"/>
<listbox Name="lstResult" Foreground="White" IsEnabled="False" Margin="145,345,30,10" />
</Grid>
</Page>

Code xong thì Design sẽ ra ntn..

Mở MainPage.xaml.cs để code xử lý:

Tool copy, paste
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
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;
using Windows.Devices.Enumeration.Pnp;
using Windows.Devices.Enumeration;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace DeviceTesting
{
///




/// An empty page that can be used on its own or navigated to within a Frame.
///

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
lstDevices.SelectionChanged += new SelectionChangedEventHandler(fnDeviceChanged);
}
void fnDeviceChanged(object sender, SelectionChangedEventArgs e)
{
if(lstDevices.SelectedItem == Printer)
{
txtClassGuid.Text = "{0ECEF634-6EF0-472A-8085-5AD023ECBCCD}";
}
}

async void btnEnumerate_Click(object sender, RoutedEventArgs eventArgs)
{
var s = "System.Devices.InterfaceClassGuid:=\"" + txtClassGuid.Text + "\"";
var i = await DeviceInformation.FindAllAsync(s, null);
txtResult.Text = i.Count + " devices found\n\n";

lstResult.Items.Clear();
foreach(DeviceInformation d in i)
{
var id = "Id: " + d.Id;
var name = d.Name;
var isEnavled = "Is Enabled:" + d.IsEnabled;
var item = id + " is \n" + name + " and \n" + isEnavled;
lstResult.Items.Add(item);
}
}

}
}

Xong! Thưởng thức thành quả nào (à nhớ chọn Printer thì mới ra nhé, vì code chỉ demo thôi :))

4, Tài liệu tham khảo


https://msdn.microsoft.com/library/windows/apps/windows.devices.enumeration.aspx
https://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.enumeration.pnp.aspx

Video hướng dẫn bởi Mr.Tuan :)

Xem thêm

Thứ Tư, 14 tháng 9, 2016

Background Task trong Windows Store App

  Không có nhận xét nào
12:47


Hôm nay, mình sẽ hướng dẫn tạo một app windows store có thể chạy ngầm, khi mà ứng dụng vẫn đang hoạt động dù bạn không thao tác hay đang thao tác một ứng dụng khác. Chủ đề chỉ cho bạn làm thế nào để tạo và đăng ký chạy nền trong Windows. Bắt đầu nào :)

1. Khái niệm

Background Task là tác vụ nền, cụ thể ở đây là tác vụ hay ứng dụng chạy nền trong Windows.


Để dễ hình dung, bạn có thể dễ ràng nhận thấy trong thực tế có rất nhiều ứng dụng Background Task, vd: Unikey, Nhaccuatui, Facebook, Zalo, pm Diệt virust,.. Điểm chung của chúng bạn có thể nhận thấy là tuy bạn không tương tác (lockscreen, run app khác,.) nhưng nó vẫn hoạt động, chơi nhạc, đẩy thông báo, quyét virut ngầm,.. Đó là nhờ Background Task


Giờ bắt tay nào code nào :)

2. Thiết kế giao diện

Điều đầu tiên, dĩ nhiên là tạo project mới rồi :)

Vào Solution Explorer -> Mở Package.appxmanifest -> Declarations -> Trong Available Declarations chọn Background Task -> Add -> Tích System event trong Properties -> Nhập “BackgroundTasks.Update” trong Entry Point

Chọn MainPage.xaml, để quay lại phần thiết kế XAML 

<TextBlock x:Name="lblResult" FontSize="25" Margin="458,418,508,250" Width="400"/><Button x:Name="btnRegister" Content="Register" Click="Register_Click" Margin="638,378,0,352"/>

Chọn vào nút Button vừa tạo

Giữ nút Ctrl và nhập đúp chuột vào để tạo sự kiện bên MainPage.xaml.cs


3. Code Xử Lý

Thêm thư viện
using Windows.ApplicationModel.Background;
Khai báo biến và tạo hàm fnChkReg(): kiểm tra xem Background Task đã được đăng ký hay chưa  


Tạo hàm RegBgTask(): đăng ký  Background Task                 


  
Tạo hàm UnRegBgTask(): hủy  đăng ký  Background Task


Trong sự kiện nút Register_Click


Full Code
namespace BackgroundTask
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        bool r = false;
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void fnChkReg()
        {
            foreach(var t in BackgroundTaskRegistration.AllTasks)
            {
                if (t.Value.Name == "Update")
                {
                    r = true;break;
                }
                if (r) { btnRegister.Content = "UnRegister";lblResult.Text = "Task Registered"; }
                if (!r) { btnRegister.Content = "Register"; lblResult.Text = "Task UnRegistered"; }
            }

        }
        private void RegBgTask(string n, string p)
        {
            BackgroundTaskBuilder b = new BackgroundTaskBuilder();
            b.Name = n;
            b.TaskEntryPoint = p;
            b.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
            BackgroundTaskRegistration t = b.Register();
        }
        private void UnRegBgTask(string name)
        {
            foreach(var t in BackgroundTaskRegistration.AllTasks)
            {
                if (t.Value.Name == Name) { t.Value.Unregister(true); }
            }
        }
        private void Register_Click(object sender, RoutedEventArgs e)
        {
            if (r) { UnRegBgTask("Update"); r = false; } else { RegBgTask("Update", "BackgroudTask.Update"); }
            fnChkReg();
        }
    }

}

4. Tổng kết

Qua bài hướng dẫn trên các mong các bạn hình dung và hiểu rõ hơn nguyên lý, cách hoạt động Background Task trong Windows Store App. Nó là thành phần thiết yếu trong đa phần app hiện nay.

5. Tài liệu tham khảo



Xem thêm