Archive for 2012年8月

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

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” />

広告

Unspecified Error

2012年8月31日

環境: Visual Studio 2012 , Windows Phone 7

public void Read()
        {
            System.Net.WebClient cli = new System.Net.WebClient();
            Uri u = new Uri(“…”);
            cli.OpenReadCompleted += new OpenReadCompletedEventHandler(cli_OpenReadCompleted2);
            cli.OpenReadAsync(u);
        }

        void cli_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                e.Result.Position = 0;   <<ここで、Position を0にしないと・・・
                …
                MemoryStream memoryStream = new MemoryStream(img);
                …
                BitmapImage bitmapImage = new BitmapImage();
                …
                bitmapImage.SetSource(memoryStream);  <<ここで、unspecified error 例外が発生する可能性があります。

IsolatedStorageFile で Uri が機能しない

2012年8月29日

http://stackoverflow.com/questions/7702944/using-isolated-storage-images-in-the-hubtiles

にあるように、IsolatedStorageFile で Uri が機能しない場合の回避方法

それから、IsoratedStorageFile の中身の確認方法

DIR する場合

ProductID は、WMAPpManifest.xml の ProductID の値を使用する。

“C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Tools\IsolatedStorageExplorerTool\ISETool.exe” dir:”/shared/shellcontent” de ProductID

GETする場合

“C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Tools\IsolatedStorageExplorerTool\ISETool.exe” ts de ProductID c:\Tmp

The request is not supported. 例外

2012年8月29日

環境: Windows Phone 7

image に SetSource でストリームを渡したときに、img のフォーマットがPNG or JPEGでないと、この例外が発生する可能性があります。

byte[] img =…
MemoryStream memoryStream = new MemoryStream(img);
BitmapImage image = new BitmapImage();
image.SetSource(stream);

Windows Phone のタイル画像の制約

2012年8月26日

Windows Phone 7.5

BackgroundImage および BackBackgroundImage での制約です。

http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/hh202948(v=vs.92).aspx

  • .jpg または .png

  • ネットワークの変動性およびパフォーマンス上の理由から、タイル イメージにはローカル リソースの使用を検討してください。

  • 透明部分のある .png をイメージに使用すると、ユーザーのテーマ カラーが透けて表示されます。

  • タイルは 173 x 173 ピクセルです。指定したイメージの大きさが異なる場合は、173 x 173 になるように調整されます。

  • https はリモート イメージではサポートされていません。

  • リモート イメージは 80 KB 以下に制限されます。これを超える場合はダウンロードされません。(173*173*4byte=116 KB なので、非圧縮画像だとオーバーします)

  • リモート イメージは 30 秒以内にダウンロードされる必要があり、そうしないとダウンロードされません。

  • 何らかの理由で BackGround イメージまたは BackBackGround イメージの読み込みに失敗した場合、更新で設定されているその他のプロパティはいずれも変更されません。

WriteableBitmap を使用する場合の参照の追加

2012年8月26日

WriteableBitmap を使用する場合、次の2つの参照が必要。

System.Windows.Freezable
名前空間: System.Windows
アセンブリ: WindowsBase (WindowsBase.dll 内)

System.Windows.Media.Imaging.WriteableBitmap名前空間: System.Windows.Media.Imaging
アセンブリ: PresentationCore (PresentationCore.dll 内)

パスは次の通り

%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\

加えて、Bitmap を作成する時にUri を使うなら、次の System.Xaml.dll も必要。

名前空間: System.Windows.Markup
アセンブリ: System.Xaml (System.Xaml.dll 内)

Image, BitmapImage, WriteableBitmap, int[] 間の変換

2012年8月16日

環境: Windows Phone 7

// PhotoCamera –> BitmapImage –> WriteableBitmap –> int[] –> WriteableBitmap –> Image

// カメラのキャプチャーイベントから、BitmapImage を作成

BitmapImage bitmapImage = new BitmapImage();
void cam_CaptureImageAvailable(object sender, ContentReadyEventArgs e)
{
  ・・・
  bitmapImage.SetSource(e.ImageStream);
  ・・・

// BitmapImage から Imageへ

image.Source = bitmapImage;
         image.Width = bitmapImage.PixelWidth;
         image.Height = bitmapImage.PixelHeight;

// Bitmap から WriteableBitmap へ

BitmapImage bitmap =

var writableBitmap = new WriteableBitmap(bitmap);

// WriteableBitmap から int[] へ

int[] imageBuffer = writableBitmap.Pixcels;

// imageBuffer から WriteableBitmap へ

int[] imageBuffer;

WriteableBitmap writableBitmap = new WriteableBitmap(w, h);

Buffer.BlockCopy(imageBuffer, 0, writableBitmap.Pixels, 0, imageBuffer.Length * 4);

// WriteableBitmap から Imageへ

image.Source = writableBitmap;
image.Width = writableBitmap.PixelWidth;
image.Height = writableBitmap.PixelHeight;

Windows Phone Camera 初期化、DIspose

2012年8月16日

環境 Windows Phone 7 / Nokia Lumia 800

Windows Phone の PhotoCameraでは、初期化、解放を正しい手順で行わないと、カメラのプレビューページから、別のページ移動したあと、再びプレビューページに戻ってきた時に、ブラックアウトしてしまう場合があります。

public static PhotoCamera cam = null;

#region Add/Remove PhotoCamera Event Handler
private void AddCameraButtonEvents()
{
    // Add Camera Events
    cam.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(cam_Initialized);
    cam.AutoFocusCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_AutoFocusCompleted);
    cam.CaptureImageAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureImageAvailable);
    cam.CaptureStarted += new EventHandler(cam_CaptureStarted);
    cam.CaptureThumbnailAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureThumbnailAvailable);
    cam.CaptureCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_CaptureCompleted);
 
    // Add Camara Button Events
    CameraButtons.ShutterKeyHalfPressed += new EventHandler(CameraButtons_ShutterKeyHalfPressed);
    CameraButtons.ShutterKeyPressed += new EventHandler(CameraButtons_ShutterKeyPressed);
    CameraButtons.ShutterKeyReleased += new EventHandler(CameraButtons_ShutterKeyReleased);
}

private void RemoveCameraEvents()
{
    // Remove Events
    cam.Initialized -= cam_Initialized;
    cam.AutoFocusCompleted -= cam_AutoFocusCompleted;
    cam.CaptureStarted -= cam_CaptureStarted;
    cam.CaptureImageAvailable -= cam_CaptureImageAvailable;
    cam.CaptureThumbnailAvailable -= cam_CaptureThumbnailAvailable;
    cam.CaptureCompleted -= cam_CaptureCompleted;

    // Remove CameraButtonEvents
    CameraButtons.ShutterKeyHalfPressed -= CameraButtons_ShutterKeyHalfPressed;
    CameraButtons.ShutterKeyPressed -= CameraButtons_ShutterKeyPressed;
    CameraButtons.ShutterKeyReleased -= CameraButtons_ShutterKeyReleased;
}
#endregion

#region OnNavigatedTo/From
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (cam == null)
    {
        cam = new PhotoCamera(CameraType.Primary);
        AddCameraButtonEvents();
        viewfinderBrush.SetSource(cam);
    }
}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);

    ((App)CameraTF.App.Current).camCapabilities.Initialize(cam);

    if (cam != null)
    {
        RemoveCameraEvents();
        if (cam.IsFocusAtPointSupported)
        {
            RemoveAtPointFocusEvents();
        }
        cam.Dispose();
        cam = null;
    }
}
#endregion

・・・

using System.Windows;
using System.Collections.Generic;
using Microsoft.Devices;
using System.Linq;

namespace CameraTF
{
    public class CameraCapabilities
    {
        public IEnumerable<Size> Resolutions = null;
        public Dictionary<FlashMode, bool> FlashModeSupported = new Dictionary<FlashMode, bool>();
        public Size Resolution = Size.Empty;
        public bool IsFocusAtPointSupported = false;
        public bool IsFocusSupported = false;
        public FlashMode CurrentFlashMode = FlashMode.Auto;
        public CameraType CameraType = CameraType.Primary;
        public double Orientation = 0f;
        bool initialized = false;

        public void Initialize(PhotoCamera cam)
        {
            if (initialized)
                return;

            initialized = true;
            Resolutions = cam.AvailableResolutions;

            IsFocusSupported = cam.IsFocusSupported;
            IsFocusAtPointSupported = cam.IsFocusAtPointSupported;
            CameraType = cam.CameraType;
            Orientation = cam.Orientation;

            FlashModeSupported.Add(FlashMode.Auto, cam.IsFlashModeSupported(FlashMode.Auto));
            FlashModeSupported.Add(FlashMode.Off, cam.IsFlashModeSupported(FlashMode.Off));
            FlashModeSupported.Add(FlashMode.On, cam.IsFlashModeSupported(FlashMode.On));
            FlashModeSupported.Add(FlashMode.RedEyeReduction, cam.IsFlashModeSupported(FlashMode.RedEyeReduction));
       }
    }
}

Pivot で、ApplicationBar を動的に変更する

2012年8月16日

環境 Windows Phone 7

リソースにApplicationBar を定義する

<phone:PhoneApplicationPage
    x:Class=”CameraTF.PivotSettings”
    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:controls=”clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls”
    xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
    xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
    mc:Ignorable=”d” d:DesignWidth=”728″ d:DesignHeight=”480″
    FontFamily=”{StaticResource PhoneFontFamilyNormal}”
    FontSize=”{StaticResource PhoneFontSizeNormal}”
    Foreground=”{StaticResource PhoneForegroundBrush}”
    SupportedOrientations=”PortraitOrLandscape”  Orientation=”Landscape”
    shell:SystemTray.IsVisible=”True”>

<Grid x:Name=”LayoutRoot” Background=”Transparent”>
     <Grid.Resources>
         <shell:ApplicationBar x:Key=”AppBar1″ IsVisible=”True” IsMenuEnabled=”True”>
             <shell:ApplicationBarIconButton IconUri=”/icons/appbar.save.rest.png” Text=”Save” Click=”ApplicationBarIconButtonSave_Click”/>
             <shell:ApplicationBarIconButton IconUri=”/icons/appbar.back.rest.png” Text=”Cancel” Click=”ApplicationBarIconButtonBack_Click”/>
         </shell:ApplicationBar>
         <shell:ApplicationBar x:Key=”AppBar2″ IsVisible=”True” IsMenuEnabled=”True”>
             <shell:ApplicationBarIconButton IconUri=”/icons/appbar.back.rest.png” Text=”Cancel” Click=”ApplicationBarIconButtonBack_Click”/>
         </shell:ApplicationBar>
     </Grid.Resources>
     <!–ピボット コントロール–>
     <controls:Pivot x:Name=”Setting” Title=”{Binding Path=LocalizedResources.Title, Source={StaticResource LocalizedStrings}}”  SelectionChanged=”Pivot_SelectionChanged_1″>

・・・

SelectionChanged イベントで切り替える。

private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    switch (((Microsoft.Phone.Controls.Pivot)(sender)).SelectedIndex)
    {
        case 0:
            ApplicationBar = (ApplicationBar)(this.LayoutRoot.Resources[“AppBar1”]);
            break;
        case 1:
            ApplicationBar = (ApplicationBar)(this.LayoutRoot.Resources[“AppBar2”]);
            break;
・・・
    }
}

ManipulationDelta のパターン

2012年8月16日

環境: Windows Phone 7

画像を移動・拡縮する際のパターン

private void img_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
    Image img = (Image)sender;

    // 水平・垂直方向の移動
    var tx = e.DeltaManipulation.Translation.X;
    var ty = e.DeltaManipulation.Translation.Y;
    img.Margin = new Thickness(tx, ty, 0, 0);

    // 拡大縮小
    var max = Math.Max(
        e.DeltaManipulation.Scale.X,
        e.DeltaManipulation.Scale.Y);
    var min = Math.Min(
        e.DeltaManipulation.Scale.X,
        e.DeltaManipulation.Scale.Y);
    var scale = (max > 1.0) ? max : min;

    if (scale < 0)
        return;

    var newWidth = img.Width * scale;
    var newHeight = img.Height * scale;

    // 小さすぎる場合は触れなくなるので、ある程度大きさで縮小中止。
    // 大きすぎる場合(2000px以上)は、処理が遅くなるので、拡大中止。
    if (newWidth < 320 || newHeight < 240 || newWidth > 2000 || newHeight > 2000)
        return;
    img.Width = newWidth;
    img.Height = newHeight;
}