SQLの窓

2012年09月29日


WebClient で取得したデータを元に、コントロールの表示状態を変更する / Windows Phone(C#)



内容は、『WebClient でページのタイトルを WEB から取得して表示する / Windows Phone(C#)』と同じですが、チェックボックスは変更可能なコントロールなので、TwoWay に設定して、画面から変更した場合に Class1 のプロパティにデータがセットされる事を確かめるようにしています。

もし、このセットする部分に Web 経由でデータを POST すれば、受け取った PHP 等がサーバにデータを保存する事が可能になります。

MainPage.xaml 全体のソースコード

▼ 主要部分
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
	<CheckBox
		Content="CheckBox Setting"
		Height="Auto"
		HorizontalAlignment="Left"
		Margin="60,20,0,0"
		Name="checkBoxSetting"
		VerticalAlignment="Top"
		IsChecked="{
			Binding
			Source={StaticResource class1},
			Path=CheckBoxSetting,
			Mode=TwoWay
		}"/>

</Grid>


Class1.cs 全体のソースコード

▼ 主要部分
// チェックボックス用プロパティ
// ※ TwoWay でセットされる様子をチェックする為にコードを記述しています
private bool _CheckBoxSetting;
public bool CheckBoxSetting {
	get {
		return _CheckBoxSetting;
	}
	set {
		_CheckBoxSetting = value;
		Debug.WriteLine("CheckBoxSetting にデータがセットされました" + value);
	} 
}

public Class1()
{

	WebClient webClient = new WebClient();

	webClient.DownloadStringCompleted += 
		new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
	// 外部サービスから文字列を取得
	webClient.DownloadStringAsync(new System.Uri("http://textt.net/sworc/20120925064853.txt"));
}

private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
	if (e.Error != null)
	{
		Deployment.Current.Dispatcher.BeginInvoke(() =>
		{
			Debug.WriteLine(e.Error.Message);
		});
	}
	else
	{
		// プロパティにセット
		this.CheckBoxSetting = bool.Parse(e.Result);
		NotifyPropertyChanged("CheckBoxSetting");
	}
}

▼ True という文字列を返します
http://textt.net/sworc/20120925064853.txt


posted by lightbox at 2012-09-29 15:10 | Windows Phone | このブログの読者になる | 更新情報をチェックする

2012年09月28日


Windows8(C#) 2ページテンプレート



ページ追加に関しては、Visual Studio 2012 が正常なら普通にページ追加するだけなのですが、フリーズするという現象が起きているので、テンプレートを作成して運用しています。

「C:\Users\ユーザ名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#」ディレクトリに「Windows Store」ディレクトリを作成し、その中にテンプレートを入れる

また、Microsoft の解説ページにある『クイック スタート: アプリ バーの追加』 を付加してあります。

だいたいのソースコードは以下から参照できます。

MainPage : xaml / cs
BasicPage1 : xaml / cs

特に以下の部分は、WebView をキャプチャして、Rectangle に書き込むところなのでチェックしておくといいと思います。
private void AppBar_Opened(object sender, object e)
{
	WebViewBrush wvb = new WebViewBrush();
	wvb.SourceName = "contentView";
	wvb.Redraw();
	contentViewRect.Fill = wvb;
	contentView.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}

ドキュメントリンク

windows8


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

2012年09月27日


google-gson で、JSON 文字列の構成要素の一覧を取り出す処理

実用の場合は、JSON に対応するクラスを作成してデシリアライズするはずですが、てっとりばやく処理するのならこちらのほうが簡単です。

※ データは、Twitter のデータを使っていますが、Array が無かったのでこのコードでは対応していません。
package winofsql.jp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("開始");
		
		String json_string = "{ \"姓\": \"山田\", \"名\": \"太郎\", \"age\": 53 }";

		test.print_json(json_string,1);

		json_string = "";
		
		try {
			// ターゲット
			URL url = new URL("http://textt.net/sworc/20120924055943.txt");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド 
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			 
			// EUC-JP でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "UTF-8");   
			// 行単位で読み込む為の準備   
			BufferedReader br = new BufferedReader(isr);   
			String line_buffer;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				json_string += line_buffer;
			}
 
			// 各々受け持ちクラスを閉じる   
			br.close();
			isr.close();
			http.disconnect();
		}
		catch( Exception e ) {}
		
		System.out.println("★-->");
		test.print_json(json_string,2);
		
	}

	private static void print_json( String json_string, int type ) {
		
		// パーサーを取得
		JsonParser jp = new JsonParser();
		// 文字列をパース
		JsonElement je = jp.parse(json_string);

		// key と value を取得する為に、JsonObject から、entrySet メソッドを実行
		Set<Map.Entry<String, JsonElement>> entrySet = je.getAsJsonObject().entrySet();

		// イテレータを取得
		Iterator<Map.Entry<String, JsonElement>> it = entrySet.iterator();

		// 一覧表示
		while(it.hasNext())
		{
			Map.Entry<String, JsonElement> entry = it.next();

			String key = entry.getKey();
			JsonElement value = entry.getValue();

			System.out.print(key+" : ");
			if ( value.isJsonObject() ) {
				System.out.println("★-->");
				print_json( value.toString(), 2 );
			}
			else {
				if ( value.isJsonNull() ) {
					System.out.println("NULL");
				}
				else {
					System.out.println(value.getAsString());
				}
			}
			// value.toString() だと、個別の文字列の場合 " で挟まれた文字列が取得されました
		}
		
		if ( type == 1 ) {
			// ***************************************
			// メンバ名で値を取得
			// ***************************************
			JsonObject jo = je.getAsJsonObject();
				System.out.println(jo.get("姓").getAsString());
				System.out.println(jo.get("名").getAsString());
				System.out.println(jo.get("age").getAsInt());
		}
		else {
			System.out.println("<--★");
		}

	}


}


▼ 結果

開始
姓 : 山田
名 : 太郎
age : 53
山田
太郎
53
★-->
id : 91500526
profile_background_tile : false
notifications : false
profile_sidebar_fill_color : FFF7CC
location : 大阪府
screen_name : sworc
profile_image_url : http://a0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
contributors_enabled : false
utc_offset : 32400
time_zone : Osaka
is_translator : false
default_profile : false
profile_background_color : 000000
name : night w?lker
geo_enabled : false
lang : ja
protected : false
profile_background_image_url : http://a0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
id_str : 91500526
listed_count : 6
profile_link_color : FF0000
follow_request_sent : false
description : 絵を描くプログラマ。好きな食べ物は水餃子。手書きブログ。DAZ3D。GIMP。Three.js。フリーフォントで簡単ロゴ作成 http://lightbox.on.coocan.jp/html/fontImage.php http://goo.gl/HDqTM
profile_use_background_image : true
following : false
profile_text_color : 0C3E53
url : http://winofsql.jp/
friends_count : 25
profile_background_image_url_https : https://si0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
created_at : Sat Nov 21 04:24:25 +0000 2009
default_profile_image : false
profile_sidebar_border_color : F2E195
verified : false
status : ★-->
in_reply_to_status_id_str : NULL
geo : NULL
place : NULL
created_at : Sun Sep 23 16:49:33 +0000 2012
in_reply_to_user_id_str : NULL
retweeted : false
in_reply_to_screen_name : NULL
truncated : false
possibly_sensitive_editable : true
possibly_sensitive : false
id_str : 249913404016427008
contributors : NULL
in_reply_to_status_id : NULL
in_reply_to_user_id : NULL
favorited : false
source : <a href="http://winofsql.jp/" rel="nofollow">TwitLink</a>
coordinates : NULL
id : 249913404016427008
retweet_count : 0
text : 家に持ち帰った mdb で簡単に php からアクセスしてテストプログラムを作る( DBクラス付き ) http://t.co/bDzKDGLY
<--★
favourites_count : 1
statuses_count : 6120
profile_image_url_https : https://si0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
followers_count : 55
<--★




タグ:JSON
posted by lightbox at 2012-09-27 21:20 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2012年09月21日


android-binding を使用した、固定値、イベント、オプションメニューの構築


Google ドライブからダウンロード



バインドの方法としては、BindingActivityV30 + inflateAndBind を使うのが最新なのですが、作者さんの最新のサンプルがまだそれを使って無いのでここでは利用していません。それを利用すると、Android の最新バージョンで ActionBar を使う事を簡単に変更できるようです( メイン画面とメニューと ActionBar を一つの XML で定義します / 動作確認はしました )

プロジェクト作成の基本部分

android-binding を使って Windows C#(XAML) のようなバインド処理の実装

画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:binding="http://www.gueei.com/android-binding/"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/padding_medium"
        binding:text="hello"
        tools:context=".P1Activity" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        binding:text="button_value" 
        binding:onClick="Button_Click_1"/>

</RelativeLayout>



メニュー定義
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:binding="http://www.gueei.com/android-binding/">
    <item android:id="@+id/menu_settings"
        binding:title="bind_menu"
        android:orderInCategory="100"
        android:showAsAction="never" 
        binding:onClick="Menu_Click_1"/>
</menu>



BindingActivity

bindModel.button_value.set("ボタン"); は、クラス内で初期設定するのでは無く、外から設定した例です。また、メイン画面用のオブジェクトをメニューに引き渡して、メニュー処理から本体画面のバインド処理を行えるようにしています。( 別に分ける必要はありませんが、分けたとしたらこんな感じかと思います )

package winofsql.jp;

import gueei.binding.Binder;
import gueei.binding.app.BindingActivity;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.support.v4.app.NavUtils;

public class P1Activity extends BindingActivity  {

    private BindModel bindModel = new BindModel();
    private BindModelMenu bindModelMenu = new BindModelMenu(bindModel);
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        bindModel.button_value.set("ボタン");
        this.setAndBindRootView(R.layout.activity_p1, bindModel);
        this.setAndBindOptionsMenu(R.menu.activity_p1, bindModelMenu);
    }
    
}


メイン画面のバインド用クラス
package winofsql.jp;

import android.view.View;
import gueei.binding.Command;
import gueei.binding.observables.StringObservable;
import gueei.binding.pojo.PojoViewModel;
import gueei.binding.pojo.PojoViewModelHelper;

public class BindModel implements PojoViewModel {

    private PojoViewModelHelper helper = new PojoViewModelHelper();
    
    public final StringObservable hello = new StringObservable("こんにちは");
    public final StringObservable button_value = new StringObservable();

    public final Command Button_Click_1 = new Command() {
        @Override
        public void Invoke(View arg0, Object... arg1) {
        	hello.set("はじめまして");
        }
    };
    
    @Override
    public PojoViewModelHelper getHelper() {
        return helper;
    }
 
    @Override
    public void notifyPropertyChanged( String propertyName ) {
        helper.notifyPropertyChanged( propertyName );
    }

}


メニュー用のバインド用クラス
※ メイン画面用の中に書いて共用してもいいです
package winofsql.jp;

import android.view.View;
import gueei.binding.Command;
import gueei.binding.observables.StringObservable;
import gueei.binding.pojo.PojoViewModel;
import gueei.binding.pojo.PojoViewModelHelper;

public class BindModelMenu implements PojoViewModel {

    private PojoViewModelHelper helper = new PojoViewModelHelper();
	private BindModel bindModel;
    
    public final StringObservable bind_menu = new StringObservable("バインドメニュー");

    public final Command Menu_Click_1 = new Command() {
        @Override
        public void Invoke(View arg0, Object... arg1) {
        	BindModelMenu.this.bindModel.hello.set("メニューから変更");
        }
    };

	public BindModelMenu(BindModel bindModel) {
		this.bindModel = bindModel;
	}
 
    @Override
    public PojoViewModelHelper getHelper() {
        return helper;
    }
 
    @Override
    public void notifyPropertyChanged( String propertyName ) {
        helper.notifyPropertyChanged( propertyName );
    }

}


posted by lightbox at 2012-09-21 14:25 | Android | このブログの読者になる | 更新情報をチェックする

2012年09月15日


WebClient でページのタイトルを WEB から取得して表示する / Windows Phone(C#)

アプリケーションの初期処理で WebClient を実行してクラスのプロパティにセットしても、取得されるのが非同期のイベント内になるので、アプリケーションでのバインドが完了してしまった後になって表示されません。しかし、バインドされるプロパティは本来更新されると反映される Mode=OneWay になっているので、クラスに INotifyPropertyChanged インターフェイス を実装してプロパティ設定後に通知する事で自動的に反映されるようにする事ができます。

外部データとして、簡単にテストしやすい Textt サービスを利用しています。

バインドされるクラスの定義
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Diagnostics;
// PropertyChangedEventHandler
using System.ComponentModel;

namespace PhoneApp1
{
    public class Class1 : INotifyPropertyChanged
    {
        public Class1(){

            WebClient webClient = new WebClient();

            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
            // 外部サービスから文字列を取得
            webClient.DownloadStringAsync(new System.Uri("http://textt.net/sworc/20111003055900.txt"));
        }

        // ページ名プロパティ( バインド用 )
        public string pageName { get; set; }

        private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    Debug.WriteLine(e.Error.Message);
                });
            }
            else
            {
                // プロパティにセット
                this.pageName = e.Result;
                NotifyPropertyChanged("pageName");
                // 直接アクセス
                // (App.Current as App).mainPage.PageTitle.Text = e.Result;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                    new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}


MainPage.xaml
<phone:PhoneApplicationPage 
    x:Class="PhoneApp1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    xmlns:local="clr-namespace:PhoneApp1"
    >

    <phone:PhoneApplicationPage.Resources>
        <local:Class1 x:Key="class1"></local:Class1>
    </phone:PhoneApplicationPage.Resources>

    <!--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
                x:Name="ApplicationTitle"
                Text="マイ アプリケーション"
                Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock
                x:Name="PageTitle"
                Text="{Binding Source={StaticResource class1}, Path=pageName}"
                Margin="9,-7,0,0"
                Style="{StaticResource PhoneTextTitle1Style}" FontSize="40" />
        </StackPanel>

        <!--ContentPanel - 追加コンテンツをここに入力します-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
    </Grid>
 
    <!--ApplicationBar の使用法を示すサンプル コード-->
    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton
                IconUri="/Images/appbar_button1.png"
                Text="Button 1"/>
            <shell:ApplicationBarIconButton
                IconUri="/Images/appbar_button2.png"
                Text="Button 2"/>
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem
                    Text="MenuItem 1"
                    Click="ApplicationBarMenuItem_Click" />
                <shell:ApplicationBarMenuItem
                    Text="MenuItem 2"/>
            </shell:ApplicationBar.MenuItems>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

</phone:PhoneApplicationPage>

また、クラスをバインドしないで直接設定する方法として、MainPage.xaml.cs の初期処理で、MainPage のインスタンスを App クラスのプロパティとして設定しておいて、直接後から参照する方法もあります

App.xaml.cs
// メインページのインスタンスを格納するプロパティ
public MainPage mainPage { get; set; }

MainPage.xaml.cs
// コンストラクタでメインページの参照をグローバル化
(App.Current as App).mainPage = this;

任意のクラス内
(App.Current as App).mainPage.PageTitle.Text = e.Result;


関連する Microsoft ページ

データ バインディング(変更通知)



posted by lightbox at 2012-09-15 15:33 | Windows Phone | このブログの読者になる | 更新情報をチェックする

2012年09月08日


Windows Phone(C#) データバインドアプリケーション(DataBoundApp)テンプレートの解説

全体のソース( XAML と CS(C#) )

このテンプレートの最大の特徴は、ListBox を使用しているところにあり、その定義は以下のようになります。
<ListBox
	x:Name="MainListBox"
	Margin="0,0,-12,0"
	ItemsSource="{Binding Items}"
	SelectionChanged="MainListBox_SelectionChanged" 
>
	<ListBox.ItemTemplate>
		<DataTemplate>
			<StackPanel Margin="0,0,0,17" Width="432" Height="78">
				<TextBlock
					Text="{Binding LineOne}"
					TextWrapping="Wrap"
					Style="{StaticResource PhoneTextExtraLargeStyle}"
				/>
				<TextBlock
					Text="{Binding LineTwo}"
					TextWrapping="Wrap"
					Margin="12,-6,12,0"
					Style="{StaticResource PhoneTextSubtleStyle}"
				/>
			</StackPanel>
		</DataTemplate>
	</ListBox.ItemTemplate>
</ListBox>

ただ、このリストボックスにバインドされるデータをセットする DataContext は、この XAML に対応するクラスである、MainPage.xaml.cs で設定されています。

DataContext = App.ViewModel;

この処理が、コンストラクタで実行されているので、MainPage.xaml 内では DataContext で設定されたオブジェクトをバインド可能になっています。App.ViewModel は、static なプロパティで、中身のインスタンスは App.xaml.cs で作成されています。

この ViewModel の中にあるオブジェクトは、MainViewModel.cs で定義される MainViewModel クラスで、items プロパティを持ちます。この Items プロパティの内容が ObservableCollection<ItemViewModel> という、ItemViewModel クラスを内部に持つコレクションとなっています。

ItemsSource="{Binding Items}"
( バインド記述 )

この ItemViewModel のプロパティ( LineOne と LineTwe )こそが、実際に ListBox の内容にバインドされる実体を供給するクラスです。

ここで、ListBox.ItemTemplate 部分を削除してもアプリケーションは動作し、以下のようにオブジェクト名の一覧が表示されます。



つまり、この部分は ItemViewModel のプロパティを使って具体的に表現している部分だという事です。
<ListBox.ItemTemplate>
	<DataTemplate>
		<StackPanel Margin="0,0,0,17" Width="432" Height="78">
			<TextBlock
				Text="{Binding LineOne}"
				TextWrapping="Wrap"
				Style="{StaticResource PhoneTextExtraLargeStyle}"
			/>
			<TextBlock
				Text="{Binding LineTwo}"
				TextWrapping="Wrap"
				Margin="12,-6,12,0"
				Style="{StaticResource PhoneTextSubtleStyle}"
			/>
		</StackPanel>
	</DataTemplate>
</ListBox.ItemTemplate>



第二画面の処理

ListBox を選択する事によって、どの行かを XAML の QueryString として与え受け取り側NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex) で文字列として取得してから int に戻してどの行(index)が選択されたかを取得します。その後、

DataContext = App.ViewModel.Items[index];

として第二画面の DataContext を設定しています。


posted by lightbox at 2012-09-08 19:56 | Windows Phone | このブログの読者になる | 更新情報をチェックする

DataContext プロパティを使用したバインディングとオブジェクトそのもののバインディング / Windows Phone(C#)

一つの要素毎にバインディングするリソースを毎回指定するのは、後からソースを読む場合は理解しやすいですが、内容によっては一括で指定して簡略化したほうが良い場合もあります。その場合は、親要素の DataContext プロパティ に指定しておいて、Path(プロパティ名)だけを指定する方法があります

関連する記事

テキストリソースのバインディング / Windows Phone(C#)

MainPage.xaml
<phone:PhoneApplicationPage 
    x:Class="PhoneApp_Sample_01.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    
    xmlns:local="clr-namespace:PhoneApp_Sample_01"
    
>

    <phone:PhoneApplicationPage.Resources>
        <local:TextResource
            x:Key="textData"
            pageName="初期ページ"
            appName="テキストリソースのバインディング"
        ></local:TextResource>
        <local:SingleProp
            x:Key="singleValueClass"
            pageName="オブジェクトそのもののバインディング"
        ></local:SingleProp>
    </phone:PhoneApplicationPage.Resources>


    <!--LayoutRoot は、すべてのページ コンテンツが配置されるルート グリッドです-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.DataContext>
            <Binding Source="{StaticResource textData}"/>
        </Grid.DataContext>

        <!--TitlePanel は、アプリケーション名とページ タイトルを格納します-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock
                x:Name="ApplicationTitle"
                Text="{Binding Path=appName}"
                Style="{StaticResource PhoneTextNormalStyle}"
            />
            <TextBlock
                x:Name="PageTitle"
                Text="{Binding Path=pageName}"
                Margin="9,-7,0,0"
                Style="{StaticResource PhoneTextTitle1Style}"
            />
            <TextBlock
                x:Name="Description"
                Text="{Binding Source={StaticResource singleValueClass}}"
                Margin="9,-7,0,0"
                Style="{StaticResource PhoneTextAccentStyle}"
            />
        </StackPanel>

        <!--ContentPanel - 追加コンテンツをここに入力します-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
    </Grid>

</phone:PhoneApplicationPage>
また、方法としてオブジェクトそのものをバインディングして、Path を指定しない方法もあります。但しその場合はクラスの ToString メソッドを override して、オブジェクトの規定の文字列を書き換えておく必要があります。また、インスタンス作成時の引数を XAML で指定できないようなので、プロパティとしてセットしておくか、クラス側で用意する必要があります。

SingleProp.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace PhoneApp_Sample_01
{
    public class SingleProp
    {

        private string _singleValue;
        public SingleProp()
        {
            _singleValue = "default";
        }
        public string pageName
        {
            get
            {
                return _singleValue;
            }
            set
            {
                _singleValue = value;
            }
        }
        public override string ToString()
        {
            return _singleValue;
        }
    }
}




posted by lightbox at 2012-09-08 13:24 | Windows Phone | このブログの読者になる | 更新情報をチェックする

2012年09月07日


テキストリソースのバインディング / Windows Phone(C#)



Microsoft のページではこちら(方法 : 簡単なバインディングを作成する)になりますが、ここでは情報が足りないので補足します。

まず、名前空間の参照の為に『xmlns:local="clr-namespace:PhoneApp_Sample_01"』を追加します。

これは、PhoneApp_Sample_01 という名前空間で定義されたクラスを、XAML で参照する為の記述です。local: でクラスの実体にアクセスしてインスタンスを作成します。
※ local:クラス名
※ x:Key="インスタンス変数名"
※ 他の属性はプロパティ名
▲ インスタンスが作成された後にプロパティにこの値(プロパティの値)がセットされます

その次に、テキストリソースを供給するクラスと XAML とをリンクする .Resources の定義を追加します。

そして最後にデータのバインドを画面定義内に記述して完成です。

MainPage.xaml
<phone:PhoneApplicationPage 
    x:Class="PhoneApp_Sample_01.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    
    xmlns:local="clr-namespace:PhoneApp_Sample_01"
    
>

    <phone:PhoneApplicationPage.Resources>
        <local:TextResource
            x:Key="textData"
            pageName="初期ページ"
            appName="テキストリソースのバインディング"
        ></local:TextResource>
    </phone:PhoneApplicationPage.Resources>


    <!--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
                x:Name="ApplicationTitle"
                Text="{Binding Source={StaticResource textData}, Path=appName}"
                Style="{StaticResource PhoneTextNormalStyle}"
            />
            <TextBlock
                x:Name="PageTitle"
                Text="{Binding Source={StaticResource textData}, Path=pageName}"
                Margin="9,-7,0,0"
                Style="{StaticResource PhoneTextTitle1Style}"
            />
        </StackPanel>

        <!--ContentPanel - 追加コンテンツをここに入力します-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
    </Grid>

</phone:PhoneApplicationPage>
クラスはごく普通にプロジェクトに追加してプロパティを追加するだけです

TextResource.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace PhoneApp_Sample_01
{
    public class TextResource
    {
        private string _pageName;
        public string pageName
        {
            get
            {
                return _pageName;
            }
            set
            {
                _pageName = value;
            }
        }

        private string _appName;
        public string appName
        {
            get
            {
                return _appName;
            }
            set
            {
                _appName = value;
            }
        }

    }
}



posted by lightbox at 2012-09-07 23:46 | Windows Phone | このブログの読者になる | 更新情報をチェックする

Windows Phone エミュレータの『エラー: 保存された状態のファイル』

結構な確率で発生するエラーですが、書いてある通りのファイル( .dess )を削除すると元へ戻ります。



実際には、C:\ProgramData\Microsoft\XDE にある二つのファイルを削除しました。
Windows Phone コミュニティ フォーラムには Windows Mobile から存在する問題であると書かれています



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

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり