Archive for the ‘Windows Phone’ Category

Visual Studio 無しで、XAP ファイルを Windows Phone に配置するには

2012年10月20日

注意:
XAPファイルを Windows Phone に登録するためには、端末のロック解除がひつようです。そのためには、AppHub への登録(有料)が必要です。

開発途中の XAP ファイルを他の人にテストしてもらう際に、Visual Studio をインストールせずに Windows Phone に配置して、動作確認を行うことができます。

  1. Windows Phone SDK 7.1 をインストールします。
  2. Windows Phone をUSBで接続します。
  3. C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Tools\XAP DeploymentのXapDeploy.exe を起動します。
  4. 次のアプリケーションが起動しますので、XAPファイルを指定して、配置ボタンを押します。

image

すると、インストールが行われ、Windows Phone のアプリケーションリストに、アイコンが現れます。以上の手順により、Visual Studio 無しに、動作確認 を行うことができます。

Windows Phone SDK 7.1はこちら

http://www.microsoft.com/ja-jp/download/details.aspx?id=27570

Windows Phone SDK 7.1.1 更新プログラム はこちら

http://www.microsoft.com/ja-jp/download/details.aspx?id=29233

注意:
端末のロック解除のために、AppHub への登録が必要です。

A5p4pAmCQAAAE68

2.10 でリジェクトされたのだけど、原因がわかりません・・・IS12Tでテストしていただける人募集中 #wp7dev_jp

2012年10月20日

トライアスロン1種目目でまだ走っていますが、2.10 でリジェクトされてしまいました T T

2.10
Requirements Expected Result
Your application and metadata must have distinct, substantial and legitimate content and purpose. Your application must provide functionality other than launching a webpage.

Comments: Fail per Microsoft instruction. Please consider using the Beta option for submissions of this type.

どうもテスト側では、何も動いていないような感じがしています。

1つ心当たりがあって、デバイスはNokia Lumia 800 のカメラの Point Focus 機能(特定の場所にフォーカスを合わせる機能) を使っています。ひょっとして、Point Focus 機能がない機種だと、動作しないのかな・・・

ということで、Nokia Lumia 800以外でテストしていただける人募集中。マーケットプレースに、ベータ登録してありますので、メールアドレスを教えていただければ、アクセス設定します。
m_ _m

Windows Phone のデバイスID, 匿名 LiveID の取得

2012年10月17日

環境: Windows Phone 7.1

http://msdn.microsoft.com/ja-jp/library/microsoft.phone.info.deviceextendedproperties.trygetvalue(v=vs.92).aspx

より、重要なところを抜粋。

Windows Phone OS 7.1 では、DeviceExtendedProperties のプロパティはほとんどが廃止されました。代わりに新しい DeviceStatus クラスを使用する必要があります。ただし、場合によっては、廃止されていない DeviceExtendedProperties のプロパティを引き続き使用できます。

DeviceStatus クラス

ApplicationCurrentMemoryUsage
現在のアプリケーションのメモリ使用量をバイト単位で返します。

パブリック プロパティApplicationMemoryUsageLimit
アプリケーション プロセスで割り当てることができるメモリの最大容量をバイト単位で返します。

パブリック プロパティApplicationPeakMemoryUsage
現在のアプリケーションの最大メモリ使用量をバイト単位で返します。

パブリック プロパティDeviceFirmwareVersion
デバイスで実行されているファームウェアのバージョンを返します。

パブリック プロパティDeviceHardwareVersion
デバイスで実行されているハードウェアのバージョンを返します。

パブリック プロパティDeviceManufacturer
デバイスの製造元の名前を返します。

パブリック プロパティDeviceName
デバイス名を返します。

パブリック プロパティDeviceTotalMemory
デバイスの物理 RAM サイズをバイト単位で返します。

パブリック プロパティIsKeyboardDeployed
ユーザーがデバイスの物理ハードウェア キーボードを開いたかどうかを示します。

パブリック プロパティIsKeyboardPresent
デバイスに物理ハードウェア キーボードが含まれるかどうかを示します。

パブリック プロパティPowerSource
デバイスが現在バッテリー電源で実行されているか、外部電源に接続されているかを示します。


DeviceExtendedProperties クラス

DeviceUniqueId

バイト配列。長さは 20 バイトです。

デバイスの一意のハッシュ コード。この値は、すべてのアプリケーションに共通する定数であり、デバイスのオペレーティング システムが新しいバージョンに更新されても変わりません。デバイス ID はデバイスの所有権が移った場合でも変更されないため、アプリケーションでこの値を使用することによってユーザーを識別することはできません。

ID_CAP_IDENTITY_DEVICE権限が必要となります。


一意のデバイス ID、製造元名、モデル名など、デバイス固有の情報を取得する方法

Getting to System Information on Windows Phone 7 より

一意のデバイス ID、製造元名、モデル名など、デバイス固有の情報を取得するには、 ID_CAP_IDENTITY_DEVICE権限が必要です。

object temp = null;
DeviceManufacturer = (DeviceExtendedProperties.TryGetValue("DeviceManufacturer", out temp)) ? (temp as string) : String.Empty;

DeviceName = (DeviceExtendedProperties.TryGetValue("DeviceName", out temp) ? (temp as string) : string.Empty);

DeviceUniqueID = (DeviceExtendedProperties.TryGetValue("DeviceUniqueID", out temp) ? (temp as byte[]) : new byte[0]);

DeviceFirmwareVersion = (DeviceExtendedProperties.TryGetValue("DeviceFirmwareVersion", out temp) ? (temp as string) : String.Empty);

DeviceHardwareVersion = (DeviceExtendedProperties.TryGetValue("DeviceHardwareVersion", out temp) ? (temp as string) : String.Empty);

DeviceTotalMemory = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");

ApplicationCurrentMemoryUsage = (long) DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage");

ApplicationPeakMemoryUsage = (long) DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage");


匿名 LiveID を取得する方法

Windows Phone 7 – How to find the device unique id windows live anonymous Id and manufacturer より

匿名Live ID を取得するには、ID_CAP_IDENTITY_USER権限が必要です。

private readonly int ANIDLength = 32;  
private readonly int ANIDOffset = 2; 

string result = string.Empty; 

object anid; 

if (UserExtendedProperties.TryGetValue("ANID", out anid))  
  {
if (anid != null && anid.ToString().Length  >=
    (ANIDLength + ANIDOffset ))
    {
      result = anid.ToString().Substring(ANIDOffset, ANIDLength);  
    }
  }

C# で、MouseDragElementBehavior を設定する

2012年10月12日

環境 Windows Phone 7 + Visual Studio 2010

using Microsoft.Expression.Interactivity.Layout;
using System.Windows.Interactivity;
using System.Windows.Input;

var v = new MouseDragElementBehavior();
v.Attach(p);
v.DragFinished += new MouseEventHandler(v_DragFinished);

Path を C# で構成する

2012年10月8日

環境: WIndows Phone 7 + Visual Studio 2010

WPF だと、Expression Blend などで次のように簡単に Path を自動生成してくれます。

<Path x:Name="path" Data="M183.66667,86.666667 C189.39235,102.51222 195.97031,115.69911 204.00303,124.34783 189.46184,124.37625 176.55191,127.63058 166.26051,130.07866 177.67961,136.62725 192.00787,141.50314 209.25719,141.39676 203.19164,149.57713 198.0335,156.49435 192.99912,166.33255 202.42621,162.74626 210.94614,156.64738 218.66605,148.33266 L222.66553,167.66588 C225.54016,165.52929 227.12504,154.35884 228.999,141.99936 234.06358,144.63928 238.15358,153.77991 241.33226,168.99921 L243.66592,167.99921 C241.1493,155.99855 236.78856,146.70538 230.66566,139.99937 241.69194,144.10578 251.73257,143.90948 260.99883,140.3327 255.36431,137.34626 248.38965,134.93892 240.33229,132.99941 250.52631,127.61701 259.03319,119.28195 265.66548,107.66621 L234.3321,118.99948 C236.99567,104.86417 236.63427,91.185053 232.99878,77.999712 226.74482,85.30016 221.8588,98.979918 218.33224,118.99948 209.59223,103.54312 197.83014,93.109381 183.66667,86.666667 z" Fill="red" Height="100" Stretch="Fill" Stroke="Red" RenderTransformOrigin="0.5,0.5"  Width="100" Margin="159,30,197,477">

Windows 環境だと、次のように PathGeometry.Parse でパースできるので、Expression Blend でデザインしたデータを C# で簡単に再利用することができます。

            const string PathData = “M248,64 C236.5247,64.625058 225.71435,67.192184 215.5,71.5 L207.5,95.5 191.5,79.5 C179.10929,77.102304 168.53048,80.027027 159.5,87.5 159.50162,99.540561 161.46431,108.60788 167.5,111.5 L183.5,119.5 159.5,135.5 C160.12292,156.23214 162.17492,169.92602 167.5,167.5 172.91066,172.67869 180.71148,173.07705 191.5,167.5 L207.5,151.5 C203.2411,162.05534 202.55968,170.46419 207.5,175.5 219.38597,184.51719 230.14356,187.65745 239.5,183.5 L255.5,167.5 C252.80927,155.47101 245.02601,144.74873 231.5,135.5 L263.5,143.5 C272.5318,139.39663 278.23003,131.78108 279.5,119.5 276.83333,114.16667 274.16667,108.83333 271.5,103.5 262.70483,100.69259 251.88845,100.91719 239.5,103.5 248.65115,105.75263 260.3255,80.446287 248,64 z”;
            var g = PathGeometry.Parse(PathData);

ところが、Windows Phone 環境だと、 Path.Parse が提供されていないのと、Object.Clone がないので、次のようにべたに書かざるを得なくなります。

private Path CreatePath()
{
    var pf = new PathFigure();
    pf.StartPoint = new Point(183.66667, 86.666667);
   
    var b1 = new BezierSegment(); // C189.39235,102.51222 195.97031,115.69911 204.00303,124.34783
    b1.Point1 = new Point(189.39235, 102.51222);
    b1.Point2 = new Point(195.97031, 115.69911);
    b1.Point3 = new Point(204.00303, 124.34783);
    pf.Segments.Add(b1);
    var b2 = new BezierSegment();  // 189.46184,124.37625 176.55191,127.63058 166.26051,130.07866
    b2.Point1 = new Point(189.46184, 124.37625);
    b2.Point2 = new Point(176.55191, 127.63058);
    b2.Point3 = new Point(166.26051, 130.07866);
    pf.Segments.Add(b2);
    var b3 = new BezierSegment();  // 177.67961,136.62725 192.00787,141.50314 209.25719,141.39676 
    b3.Point1 = new Point(177.67961, 136.62725);
    b3.Point2 = new Point(192.00787, 141.50314);
    b3.Point3 = new Point(209.25719, 141.39676);
    pf.Segments.Add(b3);
    var b4 = new BezierSegment();  // 203.19164,149.57713 198.0335,156.49435 192.99912,166.33255
    b4.Point1 = new Point(203.19164, 149.57713);
    b4.Point2 = new Point(198.0335, 156.49435);
    b4.Point3 = new Point(192.99912, 166.33255);
    pf.Segments.Add(b4);
    var b5 = new BezierSegment();  // 202.42621,162.74626 210.94614,156.64738 218.66605,148.33266
    b5.Point1 = new Point(202.42621, 162.74626);
    b5.Point2 = new Point(210.94614, 156.64738);
    b5.Point3 = new Point(218.66605, 148.33266);
    pf.Segments.Add(b5);

    // L222.66553,167.66588
    var l1 = new LineSegment();
    l1.Point = new Point(222.66553,167.66588 );
    pf.Segments.Add(l1);

    var b6 = new BezierSegment();  // C225.54016,165.52929 227.12504,154.35884 228.999,141.99936 
    b6.Point1 = new Point(225.54016, 165.52929);
    b6.Point2 = new Point(227.12504, 154.35884);
    b6.Point3 = new Point(228.999, 141.99936);
    pf.Segments.Add(b6);

    var b7 = new BezierSegment();  // 234.06358,144.63928 238.15358,153.77991 241.33226,168.99921 
    b7.Point1 = new Point(234.06358, 144.63928);
    b7.Point2 = new Point(238.15358, 153.77991);
    b7.Point3 = new Point(241.33226, 168.99921);
    pf.Segments.Add(b7);

    // L243.66592,167.99921
    var l2 = new LineSegment();
    l2.Point = new Point(243.66592, 167.99921);
    pf.Segments.Add(l2);

    var b8 = new BezierSegment();  // C241.1493,155.99855 236.78856,146.70538 230.66566,139.99937  
    b8.Point1 = new Point(241.1493, 155.99855);
    b8.Point2 = new Point(236.78856, 146.70538);
    b8.Point3 = new Point(230.66566, 139.99937);
    pf.Segments.Add(b8);

    var b9 = new BezierSegment();  // 241.69194,144.10578 251.73257,143.90948 260.99883,140.3327
    b9.Point1 = new Point(241.69194, 144.10578);
    b9.Point2 = new Point(251.73257, 143.90948);
    b9.Point3 = new Point(260.99883, 140.3327);
    pf.Segments.Add(b9);

    var b10 = new BezierSegment();  // 255.36431,137.34626 248.38965,134.93892 240.33229,132.99941 
    b10.Point1 = new Point(255.36431, 137.34626);
    b10.Point2 = new Point(248.38965, 134.93892);
    b10.Point3 = new Point(240.33229, 132.99941);
    pf.Segments.Add(b10);

    var b11 = new BezierSegment();  // 250.52631,127.61701 259.03319,119.28195 265.66548,107.66621  
    b11.Point1 = new Point(250.52631, 127.61701);
    b11.Point2 = new Point(259.03319, 119.28195);
    b11.Point3 = new Point(265.66548,107.66621);
    pf.Segments.Add(b11);

    // L234.3321,118.99948
    var l3 = new LineSegment();
    l3.Point = new Point(234.3321, 118.99948);
    pf.Segments.Add(l3);

    var b12 = new BezierSegment();  // C236.99567,104.86417 236.63427,91.185053 232.99878,77.999712      
    b12.Point1 = new Point(236.99567, 104.86417);
    b12.Point2 = new Point(236.63427, 91.185053);
    b12.Point3 = new Point(232.99878, 77.999712);
    pf.Segments.Add(b12);
    var b13 = new BezierSegment();  // 226.74482,85.30016 221.8588,98.979918 218.33224,118.99948
    b13.Point1 = new Point(226.74482, 85.30016);
    b13.Point2 = new Point(221.8588, 98.979918);
    b13.Point3 = new Point(218.33224, 118.99948);
    pf.Segments.Add(b13);
    var b14 = new BezierSegment();  // 209.59223,103.54312 197.83014,93.109381 183.66667,86.666667
    b14.Point1 = new Point(209.59223, 103.54312);
    b14.Point2 = new Point(197.83014, 93.109381);
    b14.Point3 = new Point(183.66667, 86.666667);
    pf.Segments.Add(b14);

    PathFigureCollection pfc = new PathFigureCollection();
    pfc.Add(pf);

    PathGeometry pg = new PathGeometry();
    pg.Figures = pfc;
    var path = new Path();
    path.RenderTransformOrigin = new Point(0.5, 0.5);
    path.StrokeThickness = 3;
    path.Stroke = new SolidColorBrush(Colors.Red);
    path.Width = 100;
    path.Height = 100;
    path.Fill = new SolidColorBrush(Colors.Orange);
    path.Data = pg;
    path.Stretch = Stretch.Fill;
    var ct = new CompositeTransform();
    path.RenderTransform = ct;

    return path;
}

赤いモミジが WPF、オレンジのモミジが C# で実装したものです。

image

Windows Phone では、システムの肥大化を防ぐために API を絞っていますが、Clone は削らないでほしかった・・・

Windows Phone を Zune で接続すると Windows 8 がクラッシュする場合の対処方法

2012年9月30日

環境: Windows 8 Pro + zune + Windows Phone 7.1 (Nokia Lumia 800) + Visual Studio 2012 + Visual Studio 2010 + Windows Phone SDK 7.1

数日前から、次のように Windows 8 がクラッシュするようになりました。原因は不明。

  1. Windows Phone をUSBで接続
  2. zune が自動的に起動する
  3. 数秒~数分でメイン画面がブラックアウト
  4. その他画面も反応なし
  5. 数秒程度、Windows が再起動する

zune を再インストールしてもダメ、Windows Phone USB ドライバーを再インストールしてもダメ。

次の方法をとってもダメでした。

http://support.microsoft.com/kb/2410177/ja#C00D1193

  1. Zune ソフトウェアを閉じます。
  2. %userprofile%\appdata\Local\Microsoft\Zune を開く
  3. ZuneStore フォルダーを探す。右クリックして名前を "ZuneStoreBackup" に変更します。

結局、次の手順でクラッシュしなくなりました。

  1. Zune を再インストール
  2. Windows Phone SDK 7.1 を修復インストール
  3. Windows Phone SDK 7.1.1 をインストール

Path を回す

2012年9月27日

環境: Windows Phone 7

デザイナーでアニメーションを設定するのは簡単ですが、固定パターンしかアニメーションを設定できません。動的にアニメーションを作成するには、次のような方法でオブジェクトにアニメーションを設定して、ストーリーボードを再生する必要があります。この時、試行錯誤をしたので、その時のメモです。

ポイント1:
SetTarget で、CompositeTransform に名前を付けて、それに対して、アニメーションのターゲットを設定します。
この時、SetTargetName(daukf1, “ct”);
のように名前で指定しようとすると、InvalidOperationalException、”Cannot resolve TargetName ct” という例外が発生して、うまくいきません。SetTarget(daukf1, ct) で直接指定するとうまくいきます。指定方法が悪いのか、原因は不明です。

ポイント2:
SetTargetPropert で、 ターゲットプロパティに new PropertyPath(CompositeTransform.RotationProperty) を設定します。

<Path x:Name="path" Data="M178,173 L231,109 C231,109 278,143 279,146 C280,149 276,221 272,222 C268,223 203.00009,247 192.00006,245 C181.00002,243 178,173 178,173 z" Fill="Blue" Height="100" Stretch="Fill" Stroke="Red" RenderTransformOrigin="0.5,0.5"  Width="100">
    <Path.RenderTransform>
        <CompositeTransform x:Name="ct"/>
    </Path.RenderTransform>
</Path>

Storyboard sb1 = new Storyboard();

DoubleAnimationUsingKeyFrames daukf1 = new DoubleAnimationUsingKeyFrames();

EasingDoubleKeyFrame ldkf1 = new EasingDoubleKeyFrame();
ldkf1.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0));
ldkf1.Value = 0;
EasingDoubleKeyFrame ldkf2 = new EasingDoubleKeyFrame();
ldkf2.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 1));
ldkf2.Value = 100;

daukf1.KeyFrames.Add(ldkf1);
daukf1.KeyFrames.Add(ldkf2);

Storyboard.SetTarget(daukf1, ct);
Storyboard.SetTargetProperty(daukf1, new PropertyPath(CompositeTransform.RotationProperty));

sb1.Children.Add(daukf1);
sb1.Begin();

Storyboard の例

2012年9月25日

 

Storyboard sb1 = new Storyboard();

DoubleAnimationUsingKeyFrames daukf1 = new DoubleAnimationUsingKeyFrames();
daukf1.Duration = TimeSpan.FromSeconds(5);

EasingDoubleKeyFrame ldkf1 = new EasingDoubleKeyFrame();
ldkf1.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0));
ldkf1.Value = 0;
EasingDoubleKeyFrame ldkf2 = new EasingDoubleKeyFrame();
ldkf2.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 5));
ldkf2.Value = 100;

daukf1.BeginTime = TimeSpan.FromSeconds(0);
daukf1.Duration = TimeSpan.FromSeconds(5);
daukf1.KeyFrames.Add(ldkf1);
daukf1.KeyFrames.Add(ldkf2);

Storyboard.SetTarget(daukf1, path);
Storyboard.SetTargetProperty(daukf1, new PropertyPath(Path.WidthProperty));
          

sb1.Children.Add(daukf1);
sb1.Begin();

Windows Phone で XNA.Framework で効果音を鳴らす時の注意

2012年9月21日

環境 Windows Phone 7

5.1 .2 Application Reliability (InvalidOperation Exception) でリジェクトされましたので、その原因と対策をさらしておきます。

症状

XNA Framework で効果音を使用していた。音楽を連続再生している状態で、アプリケーションを実行していると、InvalidOperation Exception で落ちる。

原因

Windows Phone で、XNA Framework を使うと、次のような感じで簡単に効果音を鳴らすことができます。

soundPath = "sounds/abc.wav";
var soundUri = App.GetResourceStream(new Uri(soundPath, UriKind.Relative));
var sound = SoundEffect.FromStream(soundUri .Stream);
SoundEffect.MasterVolume = (float)…settings.SoundVolume;
var mySoundInstance = sound .CreateInstance();
mySoundInstance.Play();

音楽を再生した状態で、しばらくすると、次の例外メッセージで、InvalidOperation でクラッシュします。

注意しなければならないのが、音楽を再生状態で、アプリを起動しないと、クラッシュしません(たぶん)。

例外メッセージ
FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See http://go.microsoft.com/fwlink/?LinkId=193853 for details.

なぜテストで見つからなかったか

テストケース漏れ。

音楽再生中でないと、例外が発生しない可能性があります。また、例外発生まで、多少の時間がかかる場合があるようです。このため、音楽の再生、停止を繰り返しながら、ある程度の時間アプリを操作し続けるというテストが必要だとおもいます。

いつもは、Walkman やPCで音楽を聴いていたので、Windows Phone で音楽を聴きながら、アプリを操作するというテストケースが、完全に頭から抜けていました。

Windows Phone の審査では、音楽を再生中に、アプリケーションが勝手に音楽再生を停止しないという基準がありますが、そのテストケースに加えて、音楽の連続再生中に、ある程度の時間アプリを操作するというテストケースも必要です。

対策

Windows Phone アプリケーションでの XNA Framework イベントの有効化

にあるように、Game クラスを実装していないアプリケーション
(たとえば Silverlight アプリケーション モデルを使用する Windows Phone アプリケーション、具体的には上記効果音を鳴らすだけのために XNA を呼んだ場合)から、
XNA Framework を使用する場合は、自身で FrameworkDispatcher.Update メソッドを呼び出して、XNA Framework メッセージ キュー内にあるメッセージをディスパッチする必要があります。

具体的には、次の App.xaml に、

xmlns:s="clr-namespace:MyAppNameSpace;assembly=MyAppNameSpace"


<Application.ApplicationLifetimeObjects>
    <!–アプリケーションのライフタイム イベントを処理する必須オブジェクト–>
    <shell:PhoneApplicationService
        Launching="Application_Launching" Closing="Application_Closing"
        Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    <s:XNAFrameworkDispatcherService />
</Application.ApplicationLifetimeObjects>

次の XNAUpdate.cs を追加。MyAPpNameSpace は、プロジェクトに合わせて変更。

using System;
using System.Windows;
using System.Windows.Threading;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework;

namespace MyAppNameSpace
{
    public class XNAFrameworkDispatcherService : IApplicationService
    {
        private DispatcherTimer frameworkDispatcherTimer;

        public XNAFrameworkDispatcherService()
        {
            this.frameworkDispatcherTimer = new DispatcherTimer();
            this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333);
            this.frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick;
            FrameworkDispatcher.Update();
        }

        void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); }

        void IApplicationService.StartService(ApplicationServiceContext context)
        {
            this.frameworkDispatcherTimer.Start();
        }

        void IApplicationService.StopService()
        {
            this.frameworkDispatcherTimer.Stop();
        }

    }
}

参考

あと、Zuneで接続しているときには、写真や音楽系のデバッグができませんが、その回避方法など。

秋コン:実質5行で作るMusicPlayer

プログレス バーを使って処理中を表現する

2012年8月31日

環境: Windows Phone 7

毎回このURLをさがしてしまうので、メモ。

http://code.msdn.microsoft.com/WindowsPhone-howto-aa5ace8b

図 1

<ProgressBar HorizontalAlignment=”Stretch” Name=”progressBar1″ VerticalAlignment=”Center” IsIndeterminate=”True” />