WindowsPhone7 Programメモ

  • WindowsPhone7のプログラムに関するメモ


  • Windows PhoneのMetro UIをタッチでジェスチャ操作
  • Windows Phone 7 のはてなフォトライフビューワを作る (後編)
  • 開発環境作成時の注意点
    • VS2010SP1 > Blend4 SP1 > WP71SDKインストールの順で行うといいらしい
    • Expression Studio4インストール済みの場合、WP71SDKをWeb InstallerではなくISOファイルを落としてきて、インストール作業するほうが自分の環境ではよかった
      その際Blend4 for WindowsPhone?がインストール失敗したら、SDK CD内のBlend4 WindowsPhone? installerを手動で実行インストールする
  • Windows Phone SDK 7.1.1をWindows 8 Release Previewへインストールする際の注意点
  • 縦横画面への対応
    • PhoneApplicationPage? を選択します。SupportOrientation? プロパティ(その他の箇所)を Portrait から PortraitOrLanscape? に変更
      ここが基本で、レイアウト関係も対応する必要がある)
      コントロールの配置は固定位置ではなく Alignment を使って設定
  • 回転の取得
    • PhoneApplicationPage?.OrientationChanged?をイベントとして有効にする
  • ToolKit?関連
    • DatePicker?等で使用されるToolKit?の「ApplicationBar?」アイコンは「Toolkit.Content」というフォルダを作成
      ApplicationBar?.Cancel.png」「ApplicationBar?.Check.png」アイコンを登録
      アイコンはプロパティをコンテンツとして設定しておくこと。
  • SDK 7.1.1がリリースされて512MBと256MBの端末対応になった
    <!-- 512MB環境に制限したい場合↓の「Requirements」セクションをWMAppManifest.xmlで有効にする -->
       <!--
       <Requirements>
         <Requirement Name="ID_REQ_MEMORY_90"/>
       </Requirements>
       -->


  • ListBox?を横スクロールにする場合ItemsPanelTemplate?をstyle追加して、ListBox?ItemsPanel?StaticResource?としてバインドするとItemパネルが横向き対応になる
    <ItemsPanelTemplate x:Key="HorizontalItemsPanelTemplate">
      <StackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
    • ScrollViewer?.HorizontalScrollBarVisibility?="Auto"も必要

  • コンテンツマネージャーのルートは明示的に指定すること
    • contentManager.RootDirectory? = "〜〜";
  • XAMLとXNAの共存
    protected override void OnNavigatedTo(NavigationEventArgs e)
    //  XNA による描画を有効化するように、グラフィックス デバイスの共有モード設定します。
    GraphicsDevice device = SharedGraphicsDeviceManager.Current.GraphicsDevice;
    device.SetSharingMode(true);
    // 新規の SpriteBatch を作成します。これはテクスチャーの描画に使用できます。
    spriteBatch = new SpriteBatch(device);
    /// Silverlight
    elementRenderer = new UIElementRenderer(this, device.Viewport.Width, device.Viewport.Height);
    
    private void OnDraw(object sender, GameTimerEventArgs e)
    // Draw Silverlight UI element to Texture
    elementRenderer.Render();
    SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.CornflowerBlue);
    // TODO: ここに描画コードを追加します。
    // Draw Silverlight UI element
    spriteBatch.Begin();
    spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White);
    spriteBatch.End();






Target Name="AfterCompile?" Condition="'$(Obfuscate)'=='true'">

   <!-- dotfuscator.exeパスのプロパティ設定 -->
   <CreateProperty Value="C:\Program Files (x86)\Microsoft Visual Studio 10.0\PreEmptive Solutions\Dotfuscator Community Edition\dotfuscator.exe">
     <Output TaskParameter="Value" PropertyName="_DotfuscatorExePath" />
   </CreateProperty>
   <!-- 難読化するファイルのプロパティ設定 -->
   <CreateProperty Value="$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)">
     <Output TaskParameter="Value" PropertyName="_ObfuscatedFilePath" />
   </CreateProperty>
   <!-- 難読化先フォルダのプロパティ設定 -->
   <CreateProperty Value="$(ProjectDir)Dotfuscated">
     <Output TaskParameter="Value" PropertyName="_DotfuscatedFolderPath" />
   </CreateProperty>
   <!-- 難読化の実行 -->
   <Exec Command="&quot;$(_DotfuscatorExePath)&quot; /in:&quot;$(_ObfuscatedFilePath)&quot; /out:&quot;$(_DotfuscatedFolderPath)&quot; /q" />
   <!-- 難読化済みファイルをコピー -->
   <Copy SourceFiles="$(_DotfuscatedFolderPath)\$(TargetFileName)"
         DestinationFiles="$(_ObfuscatedFilePath)" />
 </Target>


<Optimize>true</Optimize>



  • MSの高橋忍氏作成のDependency Property for Windows Phone コードスニペット
  • 上記をちょっと改良、「添付プロパティ」として展開する
    • 使用する際、保存形式は必ず「UTF-8」で行うこと
      <?xml version="1.0" encoding="utf-8"?>
      <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2008/CodeSnippet">
        <CodeSnippet Format="1.0.0">
          <Header>
            <Title>Dependency Property for Windows Phone</Title>
            <Shortcut>propwp2</Shortcut>
            <Description>Dependency Property for Windows Phone コード スニペット</Description>
            <Author>shinobu takahashi / CryEarth tomoyuki sasaki</Author>
            <SnippetTypes>
              <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
          </Header>
          <Snippet>
            <Declarations>
              <Literal>
                <ID>type</ID>
                <ToolTip>プロパティの型</ToolTip>
                <Default>int</Default>
              </Literal>
              <Literal>
                <ID>name</ID>
                <ToolTip>プロパティ名</ToolTip>
                <Default>MyProperty</Default>
              </Literal>
              <Literal>
                <ID>ownerclass</ID>
                <ToolTip>このプロパティを定義しているここのクラスです</ToolTip>
                <Default>ownerclass</Default>
              </Literal>
            </Declarations>
            <Code Language="CSharp">
              <![CDATA[[System.ComponentModel.Description("説明文"), System.ComponentModel.CategoryAttribute("タブ")]
      	 public $type$ $name$
              {
                  get { return ($type$)GetValue($name$Property); }
                  set { SetValue($name$Property, value); }
              }
      
              public static readonly DependencyProperty $name$Property =
                  DependencyProperty.Register(
      				"$name$",
      				typeof($type$),
      				typeof($ownerclass$),
      				new PropertyMetadata(   // メタデータ
      					"",		// デフォルト値
      					new PropertyChangedCallback(On$name$Changed)) );
      
      	private static void On$name$Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
              {
                  $ownerclass$ userControl = obj as $ownerclass$;
      
                  if (userControl != null)
                  {
                      $type$ newValue = ($type$)e.NewValue;
                  }
              }
      
      $end$]]>
            </Code>
          </Snippet>
        </CodeSnippet>
      </CodeSnippets>