2013-05-31 3 views
2

Я разработал приложение 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

Номер 1, вы НЕ должны создавать или манипулировать элементами пользовательского интерфейса в процедурном коде в WPF. Это дерьмовая практика, возникшая из-за неспособности технологий динозавров правильно обрабатывать данные через привязку данных. Номер 2 публикует соответствующий XAML и код. –

+0

Обновлено. Я просто изучаю лучшие практики WPF и получаю свои морские ноги. Пришло в голову использовать то, что вы предложили, только после того, как большая часть программы была завершена и протестирована. Я не хочу менять его сейчас, если он не нужен на 100%. – Filip

ответ

2

OK, проблема решена. Ответ был довольно прост - испорченная установка .NET или SP3 (моя ставка на .NET). Та же программа была протестирована на двух разных виртуальных машинах и отлично работала.

Смежные вопросы