1

Windows Phone 8 ツールキットと Microsoft.Phone.Controls によって提供される TransitionService を使用して、NavigationTransition を実装しています。移行中にページがクロスフェードすることを期待していましたが、デフォルトではクロスフェードしません。

たとえば、フェード アウト トランジションを使用して前のページに戻る場合、元のページはターゲット ページが表示される前に完全に不透明になり、「ポップ」効果が生じます。

誰かがその効果を実現するためのガイダンスを提供できることを願っています.

4

2 に答える 2

0

私は最終的に、スクリーン ショットと遠方の背景平面を使用して、電話ページが「クロスフェード」しているように見えるように、ちょっと手を加えました。ここでは、ビジネスの詳細を編集しています。

public class FormPage : PhoneApplicationPage {
    public FormPage() {
        InitializeComponent();
        PrepareAnimationIn(FormApp.frameTransition);
    }

    void PrepareAnimationIn(string pageAnimation) {
        AnimatedPageFactory.SetNavigationInTransition(pageAnimation, this);
    }

    public void PrepareAnimationOut(string pageAnimation) {
        AnimatedPageFactory.SetNavigationOutTransition(pageAnimation, this);
    }

    void StoreScreenShot(string name, WriteableBitmap bitmap) {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) {
            string path = Path.Combine(screenshotDir, name + screenFileType);
            store.CreateDirectory(screenshotDir);
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(path, FileMode.Create, store)) {
                using (BinaryWriter writer = new BinaryWriter(stream)) {
                    int count = bitmap.Pixels.Length * sizeof(int);
                    byte[] pixels = new byte[count];
                    Buffer.BlockCopy(bitmap.Pixels, 0, pixels, 0, count);
                    writer.Write(pixels, 0, pixels.Length);
                }
            }
        }
    }

    WriteableBitmap FetchScreenShot(string name) {
        WriteableBitmap bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.ActualHeight);

        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) {
            string path = Path.Combine(screenshotDir, name + screenFileType);
            if (store.FileExists(path)) {

                using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(path, FileMode.Open, store)) {
                    using (BinaryReader reader = new BinaryReader(stream)) {
                        int count = bitmap.Pixels.Length * sizeof(int);
                        byte[] pixels = new byte[count];
                        reader.Read(pixels, 0, count);
                        Buffer.BlockCopy(pixels, 0, bitmap.Pixels, 0, count);
                    }
                }

                store.DeleteFile(path);
            }
        }
        return bitmap;
    }

    WriteableBitmap ScreenShot() {
        WriteableBitmap bmpCurrentScreenImage = new WriteableBitmap((int)this.ActualWidth, (int)this.ActualHeight);
        bmpCurrentScreenImage.Render(_canvas, new MatrixTransform());
        bmpCurrentScreenImage.Invalidate();
        return bmpCurrentScreenImage;
    }

    ImageBrush ImageBrushFromBitmap(WriteableBitmap bitmap) {
        return new ImageBrush { ImageSource = bitmap };
    }

    static Stack<string> formImages = new Stack<string>();
    static string screenFileType = ".frmscn";
    static string screenshotDir = "frmscrn";

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) {

        var app = Application.Current as App;

        if (e.NavigationMode == NavigationMode.New &&
            e.Uri.ToString().Contains("FormPage.xaml")) {

            WriteableBitmap screenShot = ScreenShot();

            app.RootFrame.Background = ImageBrushFromBitmap(screenShot);

            formImages.Push(Name);
            StoreScreenShot(Name, screenShot);

        } else if (e.NavigationMode == NavigationMode.Back) {
            if (formImages.Count > 0)
                app.RootFrame.Background = ImageBrushFromBitmap(FetchScreenShot(formImages.Pop()));
            else {
                //we're backing out of the last form so reset the background
                app.RootFrame.Background = null;
                RemoveCachedScreenshots();
            }
        }
    }

    public static void RemoveCachedScreenshots() {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) {
            string path = Path.Combine(screenshotDir, "*" + screenFileType);
            try {
                string[] fileList = store.GetFileNames(path);
                foreach (string f in fileList) {
                    store.DeleteFile(Path.Combine(screenshotDir, f));
                }
            } catch {

            }
        }
    }
}
于 2014-03-27T22:11:33.683 に答える
0

App.xaml.cs で RootFrameのタイプを確認してください。NavigationTransitionを使用する場合は、 TransitionFrameである必要があります。

于 2014-03-05T00:44:42.383 に答える