Я разработал приложение WPF в .NET 4.0, которое использует несколько элементов интерфейса Canvas. Все работает отлично на моей машине разработки, которая работает под управлением Windows 8.WPF Canvas не рендеринг программно добавленных детей на 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, но не будет оказывать img
объект на XP.
Номер 1, вы НЕ должны создавать или манипулировать элементами пользовательского интерфейса в процедурном коде в WPF. Это дерьмовая практика, возникшая из-за неспособности технологий динозавров правильно обрабатывать данные через привязку данных. Номер 2 публикует соответствующий XAML и код. –
Обновлено. Я просто изучаю лучшие практики WPF и получаю свои морские ноги. Пришло в голову использовать то, что вы предложили, только после того, как большая часть программы была завершена и протестирована. Я не хочу менять его сейчас, если он не нужен на 100%. – Filip