wpf – 如何将已检查的CheckBox(Aero主题)渲染为RenderTargetBitmap?

wpf – 如何将已检查的CheckBox(Aero主题)渲染为RenderTargetBitmap?,第1张

概述我的复选框呈现时没有复选标记.如果我只使用一个复选框(实例对象)进行渲染,那么我可以显示复选标记,但我无法使用此解决方案.我需要能够使用本地复选框来渲染它.此复选框通过“/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml”应用了Aero主题,这对我来说也是必须的.其他主题内置主题,如Royal和Luna,带有复选标记 我的复选框呈现时没有复选标记.如果我只使用一个复选框(实例对象)进行渲染,那么我可以显示复选标记,但我无法使用此解决方案.我需要能够使用本地复选框来渲染它.此复选框通过“/PresentationFramework.Aero;component/themes/Aero.normalcolor.xaml”应用了Aero主题,这对我来说也是必须的.其他主题内置主题,如Royal和Luna,带有复选标记.

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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1062535.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存