2

ユーザーがPhotoChooserTaskから選択した画像のコピーを作成し、これをアプリケーションのハブタイルの背景画像として使用しようとしていますが、これを実現するためのより適切な方法がわかりません。今のところ、ハビレ画像をPhotoChooserTask_Completed応答に設定できますが、アプリケーションを再起動または再アクティブ化したときにこの画像を保存できるように、ビットマップへのコピーアクションを実行する方法がわかりません。これまでのところ、私が持っているのは次のとおりです。

HubTilesのデータを管理するためのカスタムTileItemクラスを作成します

TileItem.cs

public class TileItem
{
    //Old Implementation        
    //public string ImageUri  { get; set; }

    //New Implementation
    public BitmapImage ImageUri { get; set; }
    public string Title  { get; set; }
    public string Notification  { get; set; }
    public bool DisplayNotification
    {
        get { return !string.IsNullOrEmpty(this.Notification); }
    }

    public string Message  { get; set; }
    public string GroupTag   { get; set; }

    //for translation purposes (bound to HubTile Title on MainPage) 
    public string TileName  { get; set; }

MainPage.xaml.cs

PhotoChooserTask photoChooserTask;
TileItem tileItem;

public MainPage()
    {
        InitializeComponent();

        CreateHubTiles();

        photoChooserTask = new PhotoChooserTask();
        photoChooserTask.Completed += new EventHandler<PhotoResult>(photoChooserTask_Completed);
    }

次に、タイルを作成し、カスタム設定クラスを使用してデータを永続化します(つまり、「ImageUri」(現在はビットマップ))

public void CreateHubTiles()
    {            
        List<TileItem> tileItems = new List<TileItem>() 
        {
            new TileItem() { ImageUri = Settings.shareImage.Value, Title = "status", /*Notification = "last shared link uri",*/ Message = Settings.statusMessage.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Status_Title },


            new TileItem() { ImageUri = Settings.linkImage.Value, Title = "link", /*Notification = "last shared status message",*/ Message = Settings.linkUri.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Link_Title },
        };

        this.tileList.ItemsSource = tileItems;
    }

そして、私はPhotoChooserTaskハンドラーの世話をします

public void changePictureMenuItem_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        var menuItem = (MenuItem)sender;
        tileItem = menuItem.DataContext as TileItem;  //used in PhotoChooserTask_Completed                

        try
        {
            photoChooserTask.Show();
        }
        catch (System.InvalidOperationException ex)
        {
            //MessageBox.Show("An error occurred");
            MessageBox.Show(AppResource.Main_MainPage_ContextMenu_ChangePicture_Error_Message);
        }
    }

    void photoChooserTask_Completed(object sender, PhotoResult e)
    {

        if (e.TaskResult == TaskResult.OK)
        {
            //BitmapImage bitmap = new BitmapImage();
            //bitmap.SetSource(e.ChosenPhoto);

            //get the correct tileItem that was clicked and set image source to respective hubtile
            string tileTitle = tileItem.Title.ToString();

            switch (tileTitle)
            {
                case "status":

                    tileItem.ImageUri.SetSource(e.ChosenPhoto);  //changes the hubtile image to selected image
                    //Settings.shareImage.Value.Equals(e.ChosenPhoto);

                    //Set the selected image to the shareImage bitmap in the Settings class to persist image
                    Settings.shareImage.Value.Equals(tileItem.ImageUri); //not working!                      
                    break;
                case "link":
                    //Same as above
                    tileItem.ImageUri.SetSource(e.ChosenPhoto);
                    //Settings.linkImage.Value.Equals(e.ChosenPhoto);
                    Settings.linkImage.Value.Equals(tileItem.ImageUri);
                    break;
            }

        }
        else if (e.TaskResult == TaskResult.Cancel)
            //MessageBox.Show("No picture was chosen - operation was cancelled", "Picture not chosen", MessageBoxButton.OK);
            MessageBox.Show(AppResource.Main_MainPage_ContextMenu_ChangePicture_TaskResultCancel_Message, AppResource.Main_MainPage_ContextMenu_ChangePicture_TaskResultCancel_Caption, MessageBoxButton.OK);
        else
            //MessageBox.Show("Error while choosing photo:\n" + e.Error.Message, "Fail", MessageBoxButton.OK);
            //MessageBox.Show("Error while choosing picture", "Fail", MessageBoxButton.OK);
            MessageBox.Show(AppResource.Main_MainPage_ContextMenu_ChangePicture_TaskResultError_Message, AppResource.Main_MainPage_ContextMenu_ChangePicture_TaskResultError_Caption, MessageBoxButton.OK);
    }

元々は設定されSettings.shareImage.ValueSettings.linkImage.valueいますが、PhotoChooserTask_Completedイベントでそれに応じて変更または更新されません。

Settings.cs

public static readonly Setting<BitmapImage> shareImage = new Setting<BitmapImage>("shareImage", new BitmapImage(new Uri("/Images/shareStatusImage.jpg", UriKind.Relative)));

public static readonly Setting<BitmapImage> linkImage = new Setting<BitmapImage>("linkImage", new BitmapImage(new Uri("/Images/shareLinkImage.jpg", UriKind.Relative)));

したがって、画像はアプリが閉じられていないときにのみ更新され(PhotoChooserTask_Completedイベントで)、再起動またはアクティブ化すると元の画像に戻されます。それに応じてこれらの画像をコピーして、PhotoChooserTaskから選択した画像を各TileItemの新しいImageUri(実際には私のファーストクラスによると実際にはビットマップ)として永続的に使用できるようにするにはどうすればよいですか?

4

1 に答える 1

2

私があなたを心から理解しているなら、あなたは撮った画像を隔離されたストレージに保存し、次の起動でアプリケーションにロードする方法を見つける必要があります。http://www.windowsphonegeek.com/tips/All-about-WP7-Isolated-Storage --- Read-and-Save- Imagesを見てください。これには、ビットマップイメージを保存およびロードするための完全なコードが含まれています。

于 2012-08-18T10:08:33.443 に答える