SQLの窓

2013年06月09日


Win8 ストアから Post 投稿

Get 部分を追加しました

Windows8(C#) ストアアプリ : HttpClient で Get と Post する簡易クラス


非同期のメソッドを定義する場合は、async Task<T> とします。大抵の場合、メソッド化しておいたほうが使いやすいものとなります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace LBOX_Http
{
	public class Lbox
	{
		public static async Task<string> Post(string url, Dictionary<string, string> param )
		{
			string result = "";

			try
			{
				HttpClient httpClient = new HttpClient();
				httpClient.MaxResponseContentBufferSize = int.MaxValue;
				HttpContent content = new FormUrlEncodedContent(param);
				var response = await httpClient.PostAsync(url, content);
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err)
			{
				result = "ERROR:" + Err.Message;
			}

			return result;

		}
	}
}


▼ 呼び出し方法
String url = "投稿先の URL";
var param = new Dictionary<string, string>();
param.Add("u", "入力文字列");
Response.Text = await Lbox.Post(url, param);

u は、HTML 定義で FORM 内の INPUT の name 属性に割り当てられた文字列です。

関連する記事

Win8 ストア : HttpClient + XDocument で RSS の取得
Win8 ストア : UrlEncode と UrlDecode


posted by lightbox at 2013-06-09 22:08 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2013年06月07日


Win8ストア XAML の AppBarButtonStyle のContent に指定する 16進数 Unicode の取得





インターネットで使う特殊文字一覧 ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ より適当に文字列をコピーして以下の大きなフィールドに貼り付けて変換して下さい。

※ そのまま貼ってもいいんですが、StandardStyles.xaml での定義ではコードを使っているので。
※ 通常の Content でも使えますが、AppBarButtonStyle で使うと良いと思います。


posted by lightbox at 2013-06-07 02:43 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2013年05月30日


Win8 ストア : UrlEncode と UrlDecode

System.Net.WebUtility を使用します。( Windows8 のサンプルコードの 『Push and periodic notifications client-side sample』内にある Helper.cs に使用例が少しあります ) 

内部コードにあわせて、UTF8 のみ文字列のまま変換できますが、他のキャラクタセットではいったんバイト配列に変換して処理する必要があります。
// Shift_JIS で UrlEncode された文字列
string str_sjis_urlencode = "%93%FA%96%7B%8C%EA%95%5C%8E%A6";
// バイト配列に変換
byte[] sjis_data1 = Encoding.GetEncoding("SHIFT_JIS").GetBytes(str_sjis_urlencode);
// バイト配列状態で UrlDecode
byte[] sjis_data2 = WebUtility.UrlDecodeToBytes(sjis_data1, 0, sjis_data1.Length);
// バイト配列を内部コード表現の文字列に戻す
string sjis_data3 = Encoding.GetEncoding("SHIFT_JIS").GetString(sjis_data2, 0, sjis_data2.Length);
Debug.WriteLine("Shift_JIS:" + sjis_data3);

// Shift_JIS の UrlEncode に変換したい文字列
str_sjis_urlencode = "日本語表示";
// バイト配列に変換
sjis_data1 = Encoding.GetEncoding("SHIFT_JIS").GetBytes(str_sjis_urlencode);
// バイト配列状態で UrlEncode
sjis_data2 = WebUtility.UrlEncodeToBytes(sjis_data1, 0, sjis_data1.Length);
// バイト配列を内部コード表現の文字列に戻す
sjis_data3 = Encoding.GetEncoding("SHIFT_JIS").GetString(sjis_data2, 0, sjis_data2.Length);
Debug.WriteLine("Shift_JIS:" + sjis_data3);

// UTF8 で UrlEncode された文字列
string str_utf8_urlencode = "%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A1%A8%E7%A4%BA";
string str_urldecode = WebUtility.UrlDecode(str_utf8_urlencode);
Debug.WriteLine("UTF8:" + str_urldecode);

// UTF8 で UrlEncode したい文字列
str_urldecode = "日本語表示";
str_utf8_urlencode = WebUtility.UrlEncode(str_urldecode);
Debug.WriteLine("UTF8:" + str_utf8_urlencode);


以下定義の表示
#region アセンブリ System.Runtime.Extensions.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.Extensions.dll
#endregion

using System;

namespace System.Net
{
	// 概要:
	//     Web 要求の処理時に URL をエンコードおよびデコードするためのメソッドを提供します。
	public static class WebUtility
	{
		// 概要:
		//     HTTP 伝送用に HTML エンコードされている文字列を、デコードされた文字列に変換します。
		//
		// パラメーター:
		//   value:
		//     デコードする文字列。
		//
		// 戻り値:
		//     デコードされた文字列。
		public static string HtmlDecode(string value);
		//
		// 概要:
		//     文字列を、HTML エンコードされた文字列に変換します。
		//
		// パラメーター:
		//   value:
		//     エンコードする文字列。
		//
		// 戻り値:
		//     エンコードされた文字列。
		public static string HtmlEncode(string value);
		//
		public static string UrlDecode(string encodedValue);
		//
		public static byte[] UrlDecodeToBytes(byte[] encodedValue, int offset, int count);
		//
		public static string UrlEncode(string value);
		//
		public static byte[] UrlEncodeToBytes(byte[] value, int offset, int count);
	}
}


posted by lightbox at 2013-05-30 20:37 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2013年05月26日


Win8 ストア : HttpClient + XDocument で RSS の取得

実際画面表示する場合、ビジュアル的に解りやすいので NAVER の RSS を使用しています。

一般的な DOM のメソッドを使用したい場合は、XmlDocument を使用し、http の呼び出しも XmlDocument の LoadFromUriAsync(static) で読み込む事ができますが、要素や属性の取り出しは XDocument がシンプルで簡単ですし、Framework 4.0( Visual Studio 2010 ) でも共通して使えるのでおすすめです。

EnsureSuccessStatusCode メソッドは特別に呼び出す必要はなさそうですが、ドキュメントの表現からするとメモリをきちんと破棄できるようなニュアンスで書かれています( 実際のところを確かめる術はありませんが )。また手順としては、そもそも IsSuccessStatusCode が False の時にスローされるそうなので、直後で処理を中断しています。

XDocument は、余計な null チェック等が必要無いようなので、手軽にバインド用クラスにデータを追加するのに使用すると良いと思います。
private async void loadRss()
{

	var httpClient = new HttpClient();
	HttpResponseMessage response = null;
	try {
		response = await httpClient.GetAsync("http://matome.naver.jp/feed/hot");
	}
	catch (Exception ex)	{
		Debug.WriteLine(ex.Message);
	}
	// 接続に失敗
	if (response == null)	{
		return;
	}

	try {
		// HTTP 応答が成功しなかった例外をスローします。
		// Content が nullでない場合このメソッドは
		// マネージとアンマネージ リソースを解放するために 
		// Dispose を呼び出します。
		response.EnsureSuccessStatusCode();
	}
	catch (Exception ex)	{
		Debug.WriteLine(ex.Message);
	}
	// HTTP 応答の失敗
	if (!response.IsSuccessStatusCode)	 {
		Debug.WriteLine("StatusCode : " + response.StatusCode);
		return;
	}

	// 内容を文字列として取得
	var string_xml = await response.Content.ReadAsStringAsync();
	// XDocument を作成
	XDocument dom = XDocument.Parse(string_xml);

	// 参照用の名前空間を作成
	XNamespace xn_dc = "http://purl.org/dc/elements/1.1/";
	XNamespace xn_media = "http://search.yahoo.com/mrss/";

	var items = dom.Descendants("item");
	foreach (var item in items) {
		Debug.WriteLine(item.Element("title").Value);
		Debug.WriteLine(item.Element("link").Value);
		Debug.WriteLine(item.Element("matome_view").Value);
		Debug.WriteLine(item.Element("favorite").Value);
		Debug.WriteLine(item.Element("description").Value);
		Debug.WriteLine(item.Element("pubDate").Value);
		Debug.WriteLine(item.Element("guid").Value);
		// 名前空間を持つ要素の参照
		Debug.WriteLine(item.Element(xn_dc + "creator").Value);
		Debug.WriteLine(item.Element(xn_dc + "date").Value);
		// 名前空間を持つ要素の参照から、属性の参照
		Debug.WriteLine(item.Element(xn_media + "thumbnail").Attribute("url").Value);
		Debug.WriteLine(item.Element(xn_media + "content").Attribute("url").Value);
	}

}
Microsoft のドキュメント

HttpClient クラス
HttpResponseMessage クラス

XmlDocument Class


タグ:xml HTTP Windows8
posted by lightbox at 2013-05-26 00:16 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2013年05月19日


Win8 ストア : リストボックス テンプレート

SkyDrive へ移動

ダウンロードしたテンプレートは、『C:\Users\ユーザー名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#\Windows Store』に保存します。

Windows Store フォルダは最初は存在しないので作成します( 好きな名前のフォルダでも Visual Studio から利用できます )
左側のリストボックスをタップ(クリック)すると、右側のリストボックスが変化します。バインド元のデータを更新してリストボックスの表示に反映させる為に、アプリケーションバーの『設定』を実行します。 ソースコード表示 仕様 ❶ Page.Resources で XAML 内で利用する文字列とListBox 用の DataTemplate を定義 ❷ テキストエリアを設置( リストボックス内の内容を入力して更新 ) ❸ AppBar を XAML で定義 (ボタンを左側2つ、右側2つ定義) ❹ それぞれのボタンにイベントを定義 ❺ ListBox のデータバインド用に ListMain、ListItem、ListItem2 クラスListBox のタップイベントを別のソースコードに定義( partial ) ❼ TextResource.cs に、StaticResource 用のクラスを定義 ❽ デザイン時の表示用に ListMainDesignData.xaml を用意 プロジェクト用固定文字列と ListBox 用テンプレート
<Page.Resources>
	<local:TextResource
		x:Key="GlobalText"
		PageTitle="ListBox テンプレート"
		AppName="lightbox サンプルアプリケーション" />

	<!-- ListBox 用ビジュアル定義 -->
	<DataTemplate
		x:Key="ListBox2Item">
		<StackPanel
			Margin="0,0,0,4"
			Width="432"
			Height="45">
			<TextBlock
				Text="{Binding id}"
				TextWrapping="Wrap" />
			<TextBlock
				Text="{Binding name}"
				TextWrapping="Wrap"
				Margin="12,-6,12,0"
				FontSize="24" />
		</StackPanel>
	</DataTemplate>

</Page.Resources>

ListBox(繰り返しコントロール) 特有のもの

DataTemplate
リストボックスの表示部分の XAML 定義を DataTemplate として定義しておいて、ListBox 側の属性定義で実装しています( ItemTemplate="{StaticResource ListBox2Item}" )

DataContext
データバインドの大元となる ListMain クラスは、MainPage クラスでインスタンスを作成して、ListBox の DataContext に設定しています。XAML 側では、『ItemsSource="{Binding Items}"』でバインドされますが、実際の明細データは、Items の中に入る ListItem2 クラスが使用されます。

デザイン時のデータ定義
デザイン時に、ListBox の表示が可能なように、XAML 定義でデータ用のクラスを定義して、MainPage の XAML で設定しています。『d:DataContext="{d:DesignData ListMainDesignData.xaml}"
posted by lightbox at 2013-05-19 20:16 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2013年05月10日


Win8 ストア : ファイルアクセス テンプレート

SkyDrive へ移動

ダウンロードしたテンプレートは、『C:\Users\ユーザー名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#\Windows Store』に保存します。

Windows Store フォルダは最初は存在しないので作成します( 好きな名前のフォルダでも Visual Studio から利用できます )
ソースコード表示 Win8 ストア : ストアブランク テンプレートを元にファイルアクセス部分を実装しています 仕様 ❶ Page.Resources で XAML 内で利用する文字列を定義 ❷ テキストエリアを設置( ファイルの処理の為、Package.appxmanifest にファイル利用設定 ) ❸ AppBar を XAML で定義 (ボタンを左側3つ、右側2つ定義) ❹ それぞれのボタンにイベントを定義。但し、左側のファイル用ボタンは動的に作成 ❺ 保存ボタンのイベントで、MessageDialog の利用サンプルを実装 ❻ MessageDialog のイベントを別のソースコードに定義( partial ) ❼ TextResource.cs に、StaticResource 用のクラスを定義 ❽ MessageDialog 処理用の MsgBox クラス テキストエリア テキストエリアは、実際には TextBox で、AcceptsReturn="True" にする事によって複数行の入力が可能になります また、ファイルのアクセスを想定して、Package.appxmanifest に『機能』と『宣言』の設定をしています ( ページのロードでは、『text.txt』というファイルの存在チェックのみ行っています ) ファイル作成ボタンと保存ボタンの初期状態 一番最初の状態ではファイルは作成されていないので左側の3つ目のボタンは『ファイル作成』となっています。 また、右側の『保存』ボタンは、使用不可となっています。 ファイル作成とファイルの削除 bExist は、MainPage で定義した private 変数で、Page の Loaded イベントで設定しています。それによって、追加するボタンを差し換えて、それぞれの状態に対してイベントを定義していますが、この処理の切り替えは Page そのもののリロードによって行われます。
// ******************************************************
// ファイルが存在するので、削除ボタンを作成して処理を登録する
// ******************************************************
if (bExist)
{
	// インスタンス作成
	var btn = new Button();
	// スタイル
	btn.Style = (Style)App.Current.Resources["DeleteAppBarButtonStyle"];
	// テキスト表示
	AutomationProperties.SetName(btn, "削除");
	// 非同期ラムダ式
	btn.Click += async (_sender, _e) =>
	{
		MsgBox.ShowAsync(this, "OK", "ファイルを削除します");
		try
		{
			StorageFile strageFile = await storageFolder.GetFileAsync("text.txt");
			// ファイル削除
			await strageFile.DeleteAsync();
			// メニュー削除
			LeftBar.Children.RemoveAt(2);

		}
		catch (Exception ex)
		{
			Debug.WriteLine(ex.Message);
		}

		// Navigate の引数作成
		App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 1 };
		// ページを再表示
		(App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs);

	};
	LeftBar.Children.Add(btn);

	SaveButton.IsEnabled = true;
}
// ******************************************************
// ファイルが存在しない。
// 1) 作成ボタンを作成して処理を登録する
// 2) 保存ボタンを選択できないようにする
// ******************************************************
else
{
	// インスタンス作成
	var btn = new Button();
	// スタイル
	btn.Style = (Style)App.Current.Resources["AddAppBarButtonStyle"];
	// テキスト表示
	AutomationProperties.SetName(btn, "ファイル作成");
	// 非同期ラムダ式
	btn.Click += async (_sender, _e) =>
	{
		MsgBox.ShowAsync(this, "OK", "ファイルを作成します");
		try
		{
			await storageFolder.CreateFileAsync("text.txt");
			// メニュー削除
			LeftBar.Children.RemoveAt(2);

		}
		catch (Exception ex)
		{
			Debug.WriteLine(ex.Message);
		}

		// Navigate の引数作成
		App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 2 };
		// ページを再表示
		(App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs);

	};
	LeftBar.Children.Add(btn);

	SaveButton.IsEnabled = false;

}

ページのリロード

App.xaml.cs で、最初のページのロードが行われる際、以下のコードで表示する場所の骨格が作成されています。

public Frame rootFrame = Window.Current.Content as Frame;

rootFrame は、Window( 現在のアプリケーションウインドウ )Current(現在アクティブなウィンドウ)の UI である Content を Frame(フレーム)として取得しています。これは、仕様だと思われるので詳細な説明は Microsoft のドキュメントからは読み取りませんが、ブラウザと同様であると考えると良いと思います。

実際は、この rootFrame に、new Frame() でインスタンスを作成した上で利用されます。

つまり、アプリケーションの表示部分であるフレームに、実体であるページを XML ベースでロードするという手順になります。しかし、最初のロードで ページのインスタンスを作成する為に、Navigate メソッドが使用されています。

これは、この考え方でリロードすると、Navigate メソッドを実行する毎にページが新たに作成される事を意味します。

実際には、GoBack メソッドでも新たにインスタンスが作成されるようなので、画面の状態を保持して画面を切り替えるには、rootFrame.Content に保存しておいたページのインスタンスを戻すという処理が必要になります。( ここでは新しいインスタンスが都合が良いのでその方法は使っていません )

ファイルシステムへのアクセス

Windows の Shell のような感じで、フォルダオブジェクトを取得してそこからファイルオブジェクトを作成して、作成・削除・複製等の基本的な処理を行います。

ファイルの中身の更新は、FileIO という static なクラスの static なメソッドを使って、その引数としてファイルオブジェクトを使用します。

await FileIO.WriteTextAsync(strageFile, this.TextData.Text);

テキスト用のメソッドは、UTF-8N 前提の処理です。他のキャラクタセットとしてアクセスするには、バイナリデータとしてアクセスする必要があります。

Microsoft のサンプル

関連する情報

XAML コードを横に長く表示させずに、属性毎に縦に表示させる設定



タグ:Windows8
posted by lightbox at 2013-05-10 18:59 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり