![](/img/trans.png)
[英]WPF not applying default styles defined in MergedDictionaries?
[英]Styles not applying to headless wpf control
目标
我有一个WPF窗口,其中包含一些嵌套的ItemsControls
。 我需要将项目提取到位图中,但不实际显示窗口。 到目前为止,我已经克服了在不显示实际窗口的情况下渲染视觉树的一些障碍。
问题
我的问题是输出没有应用样式。
我尝试过的事情
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.