我很难在Frame中为自己的过渡动画工作。但是,以下神秘问题给我造成了致命的致命伤害。
首先,这是一个示例窗口。它由一个框架和一个按钮组成。当然,它与我的主干项目不同,但它仍然表现出相同的问题。
当我点击按钮时,框架会导航到Page1
。
编辑:这是Page1的源状态。它是在VS2010 IDE中拍摄的。
那么,问题是什么? - 当我调用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的检查状态(缺口图像和椭圆图像)尚未渲染。
我怎样才能处理这个地狱伪造的问题?原因这是一件很有意义的事情。但我认为这部分是我的应用程序的基础,所以我想完美无瑕。
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);
}
}
}
}
答案 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
实施,我无法对其进行测试,但值得一试。