J'ai une application WPF qui utilise une arborescence de vue de liste pour la navigation. Dans cet arbre, j'ai une liste des types d'objets, donc quelque chose de similaire à ceci:Problème lors de l'ajout d'une image à Framework Element Factory WPF
+Domain
-Process
-Procedure
-Task
-Object Name - Types
À côté de chaque nom d'objet sur le côté droit est une icône d'édition. Ce que je voudrais faire est d'ajouter une icône à gauche du nom de l'objet en fonction du type d'objet. Les types d'objets peuvent être des boutons radio, des combos, etc. J'ai le type d'objet provenant d'une base de données, donc c'est bien. Mon problème est que j'ai cet arbre en cours de création dynamique. J'ai donc utilisé FrameworkElementFactory afin que je puisse ajouter un panneau de pile à côté de chaque nom d'objet et ensuite mettre un bouton d'édition à côté de chaque nom d'objet. J'espère que cela a du sens.
Ce que j'ai essayé jusqu'à présent est pour la partie images:
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;
Quand j'essayer d'utiliser l'approche Bitmap, je reçois une erreur que je ne peux pas créer une instance de Window1, qui est mon Application WPF Tout ce que j'essaie de faire est de déterminer quel est le type d'objet, puis de définir une image d'icône de manière dynamique en fonction de cela. Je suis à peu près à court d'idées, existe-t-il un autre moyen d'y parvenir en utilisant cette approche?
Juste une mise à jour, j'ai finalement dépassé le plantage de l'application, que le code mis à jour est le suivant:
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);
}
Cependant, l'icône ne montre pas maintenant. Quelqu'un sait pourquoi?
Fusionné vos comptes dans votre celui enregistré (merci pour l'enregistrement, btw !). S'il vous plaît lire la [faq] (http://stackoverflow.com/faq), nous aimons garder les questions dans les questions et réponses dans les réponses. – Will
Aussi, si vous avez de nouvelles questions, n'ayez pas peur de poser une nouvelle question. Je ne suis pas sûr si votre original et l'addition que vous avez faite sont liés. Mais je peux vous dire que vous devriez afficher vos [paramètres de trace WPF] (http://i.imgur.com/mdi74.png). Aussi, un petit protip ici .... 'if (objectType == typeof (Combobox))' et WPF n'est pas des formulaires Windows. Brute-forçant votre chemin via le code n'est pas la meilleure façon. Loin de là. Tout ce code pourrait être remplacé par une simple liaison. – Will