使用复选框在导航(框架)中渲染时序

时间:2011-09-07 06:06:56

标签: c# wpf

我很难在Frame中为自己的过渡动画工作。但是,以下神秘问题给我造成了致命的致命伤害。

首先,这是一个示例窗口。它由一个框架和一个按钮组成。当然,它与我的主干项目不同,但它仍然表现出相同的问题。

enter image description here

当我点击按钮时,框架会导航到Page1

enter image description here

编辑:这是Page1的源状态。它是在VS2010 IDE中拍摄的。

enter image description here

那么,问题是什么? - 当我调用RenderToBitmap()来获取目标页面的视觉效果时出现问题。 (在这种情况下,目的地是Page1。)

我使用以下代码调用RenderToBitmap()。以下是MainWindow后面的所有代码。

public partial class MainWindow : Window
{
    public MainWindow() { InitializeComponent(); }

    Page1 pg1 = new Page1();
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.frame.Navigate(pg1); //start to navigate.
    }

    private void frame_Navigated(object sender, NavigationEventArgs e)
    {
        //SaveVisualToPng is my own static method.
        WPFHelper.SaveVisualToPng("d:\\a.png", pg1);
    }
}

最后,这是一个视觉状态,当frame_Navigated被调用时。呈现TextBox和TextBlock,CheckBox和RadioButton也呈现。但神秘的是,CheckBox和RadioButtons的检查状态(缺口图像和椭圆图像)尚未渲染。

enter image description here

我怎样才能处理这个地狱伪造的问题?原因这是一件很有意义的事情。但我认为这部分是我的应用程序的基础,所以我想完美无瑕。

EDITED(2)这里是SaveVisualToPng()的来源。最初它包含一些帮助工作的方法,比如GetDPI,但我省略了。而是跟随代码产生相同的结果。

public static class WPFHelper
{

    public static void SaveVisualToPng(string path, Visual v)
    {
        int width = Convert.ToInt32(((FrameworkElement)v).ActualWidth);
        int height = Convert.ToInt32(((FrameworkElement)v).ActualHeight);

        RenderTargetBitmap myBmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        myBmp.Render(v);

        if (myBmp != null)
        {
            PngBitmapEncoder png = new PngBitmapEncoder();
            png.Frames.Add(BitmapFrame.Create(myBmp));
            using (Stream stm = System.IO.File.Create(path))
            {
                png.Save(stm);
            }
        }
    }

}

1 个答案:

答案 0 :(得分:1)

查看在调度程序上排队工作(为WPF提供时间来呈现控件)有助于:

private void frame_Navigated(object sender, NavigationEventArgs e) 
{ 
    Action save = () => WPFHelper.SaveVisualToPng("d:\\a.png", pg1); 
    Dispatcher.BeginInvoke(DispatcherPriority.Background, save);
} 

如果没有WPFHelper实施,我无法对其进行测试,但值得一试。