C# 将控件导出到png WPF C时,数据上下文不更新元素#
我正在开发一个程序,可以打印出纸牌游戏的纸牌。在程序中,每种卡类型都有一个类和一个用户控件。我有一张大名单,里面有我所有的卡片。为了打印卡片,我在代码隐藏中动态创建控件,将这些控件添加到打印文档中,并将其打印出来。这管用!下面是我使用的控件生成的示例:C# 将控件导出到png WPF C时,数据上下文不更新元素#,c#,wpf,user-controls,png,datacontext,C#,Wpf,User Controls,Png,Datacontext,我正在开发一个程序,可以打印出纸牌游戏的纸牌。在程序中,每种卡类型都有一个类和一个用户控件。我有一张大名单,里面有我所有的卡片。为了打印卡片,我在代码隐藏中动态创建控件,将这些控件添加到打印文档中,并将其打印出来。这管用!下面是我使用的控件生成的示例: AttackCardControl cpTop = new AttackCardControl(); cpTop.DataContext = StateManager.CardsToPrint.ElementAt(i); Viewbox vb
AttackCardControl cpTop = new AttackCardControl();
cpTop.DataContext = StateManager.CardsToPrint.ElementAt(i);
Viewbox vb = new Viewbox() { Width = 240, Height = 336 };
vb.Child = cpTop;
sp.Children.Add(vb);
for (int i = 0; i < StateManager.CardsToPrint.Count; ++i)
{
Canvas cv = new Canvas();
cv.Width = 825;
cv.Height = 1125;
if (StateManager.CardsToPrint.ElementAt(i).GetType() == typeof(AttackCard))
{
AttackCardControl cardControl = new AttackCardControl();
cardControl.DataContext = StateManager.CardsToPrint.ElementAt(i);
cv.Children.Add(cardControl);
}
FileHandling.ExportToPng(new Uri(path + "/" + StateManager.CardsToPrint.ElementAt(i).Name + ".png"), cv);
}
sp是一个堆栈面板,我用来在页面上排列卡片,我是for循环的迭代器,其中包含for循环。我运行了一系列for循环,以及其他一些不相关的小东西,效果很好
现在我正在创建一个新功能,允许用户将卡片导出到PNG。我决定用一种与打印卡片非常相似的方式来做。这就是我使用的:
AttackCardControl cpTop = new AttackCardControl();
cpTop.DataContext = StateManager.CardsToPrint.ElementAt(i);
Viewbox vb = new Viewbox() { Width = 240, Height = 336 };
vb.Child = cpTop;
sp.Children.Add(vb);
for (int i = 0; i < StateManager.CardsToPrint.Count; ++i)
{
Canvas cv = new Canvas();
cv.Width = 825;
cv.Height = 1125;
if (StateManager.CardsToPrint.ElementAt(i).GetType() == typeof(AttackCard))
{
AttackCardControl cardControl = new AttackCardControl();
cardControl.DataContext = StateManager.CardsToPrint.ElementAt(i);
cv.Children.Add(cardControl);
}
FileHandling.ExportToPng(new Uri(path + "/" + StateManager.CardsToPrint.ElementAt(i).Name + ".png"), cv);
}
我只是不明白为什么它适用于打印,但它不适用于导出到PNG。任何帮助都将不胜感激
更新
我刚刚创建了一个示例项目,这个项目就有这个问题,但似乎找不到解决它的方法。示例项目有3个组件:MainWindow、UserControl1和Model.cs
主窗口是我用于控制和显示问题的窗口。代码隐藏包含发生错误的所有逻辑。对于这个简单的示例,我没有使用MVVM。
以下是XAML:
<Window x:Class="ExportTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ExportTest"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel Name="sp" Margin="10">
<Button Content="Export Control to PNG" Click="Button_Click" Width="150" Height="30"/>
</StackPanel>
</Window>
这将重新创建我的确切问题。在主窗口中,我们看到如下内容:
如您所见,UserControl1正在捕获DataContext并显示名称测试。但是,如果单击“将控件导出到PNG”按钮,则导出的PNG文件将得到以下结果:
不知怎么的,我的数据丢失了。有什么线索吗?谢谢你的帮助
// Save current canvas transform
Transform transform = surface.LayoutTransform;
// reset current transform (in case it is scaled or rotated)
surface.LayoutTransform = null;
后来
// Restore previously saved layout
surface.LayoutTransform = transform;
不会像你想象的那样工作。转换是一个类,而不是一个结构。将surface.LayoutTransform设置为null时,也将transform设置为null
试着注释掉所有这些行,看看会发生什么。如果它可以工作,但卡是旋转的,那么您必须深入克隆layouttransform,或者只保存确实更改的属性。因此我在这里找到了答案:
在将控件呈现为图像之前,需要调用UpdateLayout()来修复绑定。我注释掉了这3行,但输出中没有任何更改。它仍然有同样的问题。好的,很抱歉听到这个消息。我建议的第一件事是向Exporttopng发送一个包含一些基本控件的画布,以确保问题出现在方法中,而不是对象中。祝你好运
// Save current canvas transform
Transform transform = surface.LayoutTransform;
// reset current transform (in case it is scaled or rotated)
surface.LayoutTransform = null;
// Restore previously saved layout
surface.LayoutTransform = transform;