繁体   English   中英

样式不适用于无头WPF控件

[英]Styles not applying to headless wpf control

目标

我有一个WPF窗口,其中包含一些嵌套的ItemsControls 我需要将项目提取到位图中,但不实际显示窗口。 到目前为止,我已经克服了在不显示实际窗口的情况下渲染视觉树的一些障碍。

问题

我的问题是输出没有应用样式。

我尝试过的事情

  • 如果我先显示窗口,然后获取位图,然后关闭窗口,则一切看起来都很好(样式都已应用)。 虽然,我不认为这种“ hack”是可以接受的,但它是故障排除的一种形式。
  • ViewBox包装ContentPresenter并执行.Measure().Arrange()但这没有帮助

我已经参考了这些 问题,以使我更接近正确地解决问题,但是遗憾的是样式仍然没有应用。 我假设我缺少某种强制应用样式的步骤。 任何帮助,将不胜感激。 仅供参考,我在VS 2012中使用.Net 4。

抱歉,如果此代码的某些位不完全匹配。 如上所述,有一堆嵌套的ItemsControl,为简洁起见,我尝试缩小所有内容以使其易于使用。

设置控件

ucAncillary ancillaryControl = new ucAncillary(AncillaryGroups);
ancillaryControl.ApplyTemplate();
ancillaryControl.UpdateLayout();
ancillaryControl.Measure(new System.Windows.Size(Double.PositiveInfinity, Double.PositiveInfinity));
ancillaryControl.Arrange(new Rect(ancillaryControl.DesiredSize));

//AncillaryGroups is the name of the ItemsControl that I want the items from
ancillaryControl.AncillaryGroups.generateContainers();

foreach (var group in AncillaryGroups)
{
    var groupControl = this.AncillaryGroups.ItemContainerGenerator.ContainerFromItem(group) as ContentPresenter;
    groupControl.ApplyTemplate();

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)groupControl.DesiredSize.Width, (int)groupControl.DesiredSize.Height, 96, 96, PixelFormats.Pbgra32);
    rtb.Render(groupControl);

    MemoryStream stream = new MemoryStream();
    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));
    encoder.Save(stream);

    type.RenderedBitmap = new Bitmap(stream);
}

上面提到的GenerateContainers函数

public static void generateContainers(this ItemsControl c)
{
    IItemContainerGenerator generator = c.ItemContainerGenerator;
    GeneratorPosition position = generator.GeneratorPositionFromIndex(0);
    using (generator.StartAt(position, GeneratorDirection.Forward, true))
    {
        foreach (object o in c.Items)
        {
            DependencyObject dp = generator.GenerateNext();
            generator.PrepareItemContainer(dp);
        }
    }
}

在渲染之前,您可能必须再次测量和布置新控件:

var groupControl = ...;
groupControl.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
groupControl.Arrange(new Rect(groupControl.DesiredSize));

这是通过记忆,我会仔细检查一下自己,并在需要时进行更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM