
XAML
<Canvas name="canvas"> <button Click="button_Click" Canvas.left="440" Canvas.top="277"> Do Paint </button> <Image name="image"/></Canvas>
C#
private voID button_Click(object sender,RoutedEventArgs e) { var checkBox = new CheckBox { WIDth = 100,Height = 30,IsChecked = true,}; var rectangle = new Rect(0,checkBox.WIDth,checkBox.Height); //need this var visualBrush = new VisualBrush(checkBox); checkBox.Arrange(rectangle); var rendertargetBitmap = new rendertargetBitmap((int)rectangle.WIDth,(int)rectangle.Height,96,PixelFormats.Default); rendertargetBitmap.Render(checkBox); rendertargetBitmap.Freeze(); image.source = rendertargetBitmap;}解决方法 我使用Reflector来查看PresentationFramework.Aero程序集的内容,我发现了这里发生了什么.我有一个解决方案,但你可能不会喜欢它… 在Aero主题中,复选框使用BulletChrome控件呈现.此控件在从一种状态切换到另一种状态时使用动画,因此当您渲染复选框时,未选中到检查的动画未完成,并且刻度标记尚未显示.所以你需要等待动画完成……
在渲染之前放置Thread.Sleep将不起作用,因为当调度程序线程处于休眠状态时,动画将停止.所以你需要在渲染复选框之前等待一个新线程:
private voID button_Click(object sender,RoutedEventArgs e) { var checkBox = new CheckBox { WIDth = 100,}; var rectangle = new Rect(0,checkBox.Height); //need this var visualBrush = new VisualBrush(checkBox); checkBox.Arrange(rectangle); new Thread(() => { Thread.Sleep(300); // the animation lasts 300ms dispatcher.Invoke(() => { var rendertargetBitmap = new rendertargetBitmap((int)rectangle.WIDth,PixelFormats.Default); rendertargetBitmap.Render(checkBox); rendertargetBitmap.Freeze(); image.source = rendertargetBitmap; }); }).Start(); } (此代码使用dispatcherExtensions.Invoke扩展方法,因此您需要引用System.windows.Presentation程序集并导入System.windows.Threading命名空间)
请注意,如果SystemParameters.ClIEntAreaAnimation为false,则不会发生动画.但由于这个属性是Readonly,它并没有真正帮助你……
总结以上是内存溢出为你收集整理的wpf – 如何将已检查的CheckBox(Aero主题)渲染为RenderTargetBitmap?全部内容,希望文章能够帮你解决wpf – 如何将已检查的CheckBox(Aero主题)渲染为RenderTargetBitmap?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)