2009-12-08 1 views
2

У меня есть приложение WPF, которое использует дерево просмотра списка для навигации. В этом дереве, у меня есть список типов объектов, так что-то похожее на это:Проблема добавления изображения в Framework Element Factory WPF

+Domain 
-Process 
    -Procedure 
    -Task 
     -Object Name - Types 

Рядом с каждым именем объекта на правой стороне находится значок редактирования. Я хотел бы добавить значок слева от имени объекта на основе типа объекта. Типы объектов могут быть переключателем, комбинированным полем и т. Д. У меня есть тип объекта, поступающий из базы данных, так что это нормально. Моя проблема заключается в том, что это дерево создается динамически. Поэтому я использовал FrameworkElementFactory, чтобы добавить панель стека рядом с каждым именем объекта, а затем добавить кнопку редактирования рядом с каждым именем объекта. Надеюсь, это имеет смысл.

То, что я пытался до сих пор является для части изображения:

DataTemplate dataTemp = new DataTemplate(); 

//create stack panel and text block 

FrameworkElementFactory stkPanel = new FrameworkElementFactory(typeof(StackPanel)); 

FrameworkElementFactory txtBlock = new FrameworkElementFactory(typeof(TextBlock)); 

FrameworkElementFactory img = new FrameworkElementFactory(typeof(Image)); 

Image imgIcon = new Image(); 

BitmapImage bi = new BitmapImage(); 

//set value of text block to the object name of the tree 

txtBlock.SetValue(TextBlock.TextProperty, taskObjectRow["ObjectName"].ToString()); 

string objectType; 

objectType = taskObjectRow["Type"].ToString(); 

if (objectType.ToString() == "RadioGroup") 
{ 

    bi.UriSource = new Uri("Radiobutton.ico"); 

    imgIcon.Source = bi; 

    img.SetValue(Image.SourceProperty,imgIcon); 

} 

////set the orientation of text in the stake panel to horizontal 

stkPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); 
             FrameworkElementFactory editTreeBtn =new 

FrameworkElementFactory(typeof(editTreeButton)); 


editTreeBtn.SetValue(editTreeButton.ObjectIDProperty,taskObjectRow["ObjectID"]); 

//append txt block and user control to the stack panel 

stkPanel.AppendChild(txtBlock); 

stkPanel.AppendChild(img); 

stkPanel.AppendChild(editTreeBtn); 

//add stkPanel to data template 

dataTemp.VisualTree = stkPanel; 

Когда я пытаюсь с помощью растрового подхода, я получаю сообщение об ошибке, что я не могу создать экземпляр window1, который мой Приложение WPF. Все, что я пытаюсь сделать, это определить тип объекта, а затем установить изображение значка на основе динамического. Я просто из идей, есть ли другой способ достичь этого, используя этот подход?


Просто обновление, я, наконец, получил мимо Падает, что обновленный код заключается в следующем:

var img = new FrameworkElementFactory(typeof(Image)); 

BitmapImage bi = new BitmapImage(); 

//set value of text block to the object name of the tree 

txtBlock.SetValue(TextBlock.TextProperty, 
        taskObjectRow["ObjectName"].ToString()); 

var objectType = taskObjectRow["Type"].ToString(); 

if (objectType.ToString() == "Combobox")  
{ 

bi.BeginInit();  
bi.UriSource = new Uri(@"Combobox.ico", UriKind.Relative);  
bi.EndInit(); 

//Uri uri = new Uri("Combobox.ico", UriKind.Relative);  
//Image imgTest = new Image();  
//ImageSource imgSource = new BitmapImage(uri);  
//imgTest.Source = imgSource; 

img.SetValue(Image.SourceProperty, bi);  
img.SetValue(Image.VisibilityProperty, Visibility.Visible); 

} 

Однако, значок не отображается в настоящее время. Кто-нибудь знает, почему?

+0

Объединять ваши счета в ваш зарегистрированный один (спасибо за регистрацию, кстати !). Пожалуйста, прочитайте [faq] (http://stackoverflow.com/faq), мы хотели бы держать вопросы в вопросах и ответах в ответах. – Will

+0

Кроме того, если у вас есть новые вопросы, не бойтесь задавать новый вопрос. Я не уверен, связаны ли ваши оригиналы и добавление, которые вы сделали. Но я могу сказать вам, что вы должны настроить свои [настройки трассировки WPF] (http://i.imgur.com/mdi74.png). Кроме того, немного проталкивать здесь .... 'if (objectType == typeof (Combobox))' и WPF не является окнами. Брут-форсинг ваш путь через код НЕ лучший способ. Отнюдь не. Весь этот код можно заменить простым связыванием. – Will

ответ

0

Попробуйте что-то вроде этого:

BitmapImage bmpImg = new BitmapImage(new Uri("pack://application:,,,<AssemblyName>;component/<Path>/<ImageFilename>"); 

где

<AssemblyName> is the name of the assembly 
<Path> is the path to the image within the project 
<ImageFilename> is the name of the image with the extension 

Тогда вы можете сделать:

img.SetValue(Image.SourceProperty, bmpImg);

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