交叉淡入淡出页面转换Windows phone 8工具包

时间:2014-03-04 23:56:40

标签: windows-phone-8 transitions cross-fade

我正在使用Windows Phone 8工具包和Microsoft.Phone.Controls提供的TransitionService实现NavigationTransition。我希望页面在过渡期间交叉淡入淡出,但默认情况下它们不会交叉淡入淡出。

例如,如果我使用淡出过渡回到上一页,则原始页面会在目标页面出现之前淡化为完全不透明,从而产生“弹出”效果。

我希望有人可以就如何实现这种效果提供指导。

2 个答案:

答案 0 :(得分:0)

请检查App.xaml.cs中 RootFrame 的类型,如果要使用NavigationTransition,则必须 TransitionFrame

答案 1 :(得分:0)

我最终使用了一些轻微的屏幕截图和远背景平面使电话页面显示为“交叉淡入淡出”#34; - 这里有编辑的商业细节:

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 {

            }
        }
    }
}