WPF Canvas无法以编程方式在XP上添加子项

时间:2013-05-31 19:49:38

标签: c# .net wpf canvas

我在.NET 4.0中开发了一个WPF应用程序,它使用了几个Canvas UI元素。在运行Windows 8的开发机器上,一切正常。

当我在运行Windows XP的虚拟机中测试该应用时,我遇到了问题。 Canvas渲染在XAML中添加的元素,但无法渲染在代码中创建的元素。

程序在Windows 8,Windows 7(VM)和Windows XP SP3(VM)上进行了测试。一切正常,除了在XP下的代码隐藏中创建的元素的渲染。我已经测试过,元素已经创建,并且作为孩子正确添加。

我尝试过手动设置Z索引,调用UpdateLayout和InvalidateVisual,但无济于事。

感谢您提前提供任何帮助。

更新: XAML

<Canvas Name="frontPresenter" Background="White"
        Grid.Column="1" Grid.Row="1"/>
<Canvas Name="frontPlaceholderPresenter"
        Grid.Column="1" Grid.Row="1"
        Width="{Binding ActualWidth,
               ElementName=frontPresenter}"
        Height="{Binding ActualHeight,
               ElementName=frontPresenter}"/>

C#

foreach (Models.BadgePosition position in currentItem.BadgesLayouts[layoutItem].BadgesPositions)
{
    double size = currentItem.FrontImage.Width * (position.Badge.BadgeImage == LanguageAssets.Controls.BadgePlaceholder ? 0.1d : 0.15d) * scale;
    Image img = new Image
    {
        Source = position.Badge.BadgeImage,
        Width = size,
        Height = size
    };
    img.DataContext = position;
    Canvas.SetTop(img, currentItem.FrontImage.Height * position.Y * scale);
    Canvas.SetLeft(img, currentItem.FrontImage.Width * position.X * scale);
    if (canvas == frontPresenter)
    {
        if (position.Badge.BadgeImage == LanguageAssets.Controls.BadgePlaceholder)
            frontPlaceholderPresenter.Children.Add(img);
        else
            canvas.Children.Add(img);
    }
    else
        canvas.Children.Add(img);

本质上,我想打印最终画布,但不打印占位符。这就是为什么我在前面的画布上创建占位符图像并用用户在相同位置但在用于打印的画布上选择的图像替换图像。此代码在Windows 8和Windows 7上完成了这项工作,但在XP上出现了问题。

注意:类似代码

Canvas canvas = new Canvas();
canvas.Children.Add(img);
new Window { Content = canvas }.Show();

将在Windows 8和7上按预期绘制,但不会在XP上呈现img对象。

1 个答案:

答案 0 :(得分:2)

好的,问题解决了。答案非常简单 - .NET或SP3的安装损坏(我打赌在.NET上)。相同的程序在两个不同的虚拟机上进行了测试并且运行良好。