Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将控件导出到png WPF C时,数据上下文不更新元素#_C#_Wpf_User Controls_Png_Datacontext - Fatal编程技术网

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;