Ich habe eine WPF-Anwendung, die eine Listenansicht Baum für die Navigation verwendet. In diesem Baum habe ich eine Auflistung von Objekttypen, so etwas ähnlich wie diese:
+Domain
-Process
-Procedure
-Task
-Object Name - Types
Neben jedem Objektnamen befindet sich auf der rechten Seite ein Bearbeitungssymbol. Ich möchte ein Symbol links neben dem Objektnamen hinzufügen, das auf dem Objekttyp basiert. Objekttypen können Optionsfelder, Kombinationsfelder, etc. sein. Ich habe den Objekttyp aus einer Datenbank, das ist also in Ordnung. Mein Problem ist, dass ich diesen Baum dynamisch erstellen muss. Deshalb habe ich die FrameworkElementFactory verwendet, damit ich neben jedem Objektnamen ein Stapelfeld hinzufügen und dann neben jedem Objektnamen eine Bearbeitungsschaltfläche einfügen kann. Hoffentlich macht das Sinn.
Was ich bisher ausprobiert habe, betrifft die Bilder:
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;
Wenn ich versuche, mit der Bitmap-Ansatz, erhalte ich eine Fehlermeldung, dass ich eine Instanz von Window1, die meine WPF-Anwendung ist nicht erstellen kann. Alles, was ich versuche zu tun ist, zu bestimmen, was der Objekttyp ist, und dann ein Symbolbild dynamisch basierend auf, dass festgelegt. Ich bin gerade über aus Ideen, gibt es eine andere Möglichkeit, dies mit diesem Ansatz zu erreichen?
Nur ein Update, habe ich endlich vorbei an der App Absturz, die den aktualisierten Code ist dies:
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);
}
Allerdings wird das Symbol jetzt nicht angezeigt. Weiß jemand, warum?
0 Stimmen
Ihre Konten wurden mit Ihrem registrierten Konto zusammengelegt (danke für die Registrierung!). Bitte lesen Sie die faq Wir möchten, dass Fragen in Fragen und Antworten in Antworten bleiben.
0 Stimmen
Und wenn Sie neue Fragen haben, scheuen Sie sich nicht, eine neue Frage zu stellen. Ich bin mir nicht sicher, ob Ihre ursprüngliche und die von Ihnen hinzugefügte Frage etwas miteinander zu tun haben. Aber ich kann Ihnen sagen, dass Sie Ihren Computer aufdrehen sollten. WPF-Trace-Einstellungen . Außerdem ein kleiner Tipp: ....
if (objectType == typeof(Combobox))
und WPF ist nicht Windows Forms. Sich den Weg über den Code zu erzwingen, ist NICHT der beste Weg. Ganz im Gegenteil. All dieser Code könnte durch eine einfache Bindung ersetzt werden.