我在.NET 4.0中開發了一個使用多個Canvas UI元素的WPF應用程序。在運行Windows 8的開發機器上,一切正常。WPF畫布不在XP上以編程方式添加子項
我在運行Windows XP的虛擬機中測試該應用程序時遇到了問題。 Canvas呈現在XAML中添加的元素,但無法呈現用代碼創建的元素。
程序已在Windows 8,Windows 7(VM)和Windows XP SP3(VM)上進行了測試。除了在XP下代碼隱藏中創建的元素的渲染之外,一切正常。我已經測試並創建了元素,並將其作爲子元素正確添加。
我曾嘗試手動設置Z索引,調用UpdateLayout和InvalidateVisual,但無濟於事。
感謝您提前提供任何幫助。
UPDATE: 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你不應該創建或操縱WPF程序代碼中的UI元素。這是一個糟糕的做法,起源於恐龍技術無法正確處理數據通過數據綁定。 2號發佈相關的XAML和代碼。 –
已更新。我只是學習WPF的最佳實踐,並獲得我的海洋腿。只有在大部分程序完成並測試之後,纔想到使用您的建議。除非100%必要,否則我現在不願意改變它。 – Filip