Laden...

[gelöst] String to UIElement

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.092 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
[gelöst] String to UIElement

Hallo liebe Community,

ich habe folgendes Problem:

Ich verwalte in einer Tabelle mein Hauptmenü. Dort hinterlegt sind DisplayCaption und UserControl. (Beides strings)

Jetzt habe ich z.b. ein RechnungsControl welches ich beim klick laden möchte.

Nun stehe ich vor dem Problem dass:

grid.Childen.Add() ein UIElement von mir erwaret, ich aber nur den Namen von diesem habe und jetzt eine Instanz davon erzeugen muss.

Könnt ihr mir weiterhelfen?

Gruss

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo cs.,

was willst du machen? Könntest du dich etwas klarer ausdrücken?
Ich hab das so verstanden dass du einem Window eine UIElement übergeben das du nur per sting kennst. Dazu gibt es die Methode FrameworkElement.FindName.

Aber ich denke nicht dass dies ist was du willst

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

FindName() ist in etwa das wo ich hinmöchte, liefert mir aber leider kein UIElement zurück.

Ich möchte einem Grid ein UIElement (UserControl) als Inhalt zufügen. Kenne aber zum besagten Zeitpunkt nur den Namen (als String).

Jetzt möchte ich Quasi eine Instanz des UserControls über den Namen erstellen.

Quasi:
Activator.CreateInstance("RechnungControl", "UIElement");

Jedoch liefert dieser mir nur einen ObjectHandle zurück, den ich laut MSDN "entwrappen" muss. Damit konnte ich jedoch (bisher) nichts anfangen.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo cs.,

du hast einmal die Möglichkeit - wenn es denn möglich ist - das UIElement nach belieben zu casten. Ansonsten bleibt dir noch die Möglichkeit über den logischen bzw. visuellen Tree durchzulaufen. Aber mal abgesehen davon: Warum gibst du dem Control nicht einfach einen Namen und greifst dann auf das Control zu? So hast du viel mehr Freiheiten. Das ist auch in meinen Augen die einfachste Möglichkeit.

zero_x

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Ich kann gerade nicht ganz folgen, inwiefern ich das umsetzen soll.

Kurze Beschreibung der Sachlage:

Ich verwalte mein Hauptmenü in einer Tabelle mit dem Verweis auf das UserControl. (Das UserControl enthält bei mir quasi die gesamte GUI für den Menüpunkt).

Ergo sieht das ungefähr so aus:

DisplayCaption | UserControl

Rechnung | RechnungControl
Benutzerverwaltung | BenutzerControl

etc.

Nun fülle ich aus der Tabelle mein Menü und möchte das beim KLICK auf das Menü das UserControl "RechnungControl" z.B. ins Grid geladen wird.

Ich hoffe, ihr könnt mir folgen.

Danke für eure Hilfe & Mühe.

1.552 Beiträge seit 2010
vor 13 Jahren

zero_x mein mit einem Name geben folgendes
<Button Name="buttonName"/>

wie ich es so heraushöre hast du schon ein RechnungsControl als XAML in WPF definiert.Mit:


RechnungsControl rc = new RechnungsControl();
grid.Children.Add(rc);

kannst du es hinzufügen. Mit:


Grid.SetRow(rc,ROWNUMBER);
Grid.SetColumn(rc,COLUMNNUMBER);
Grid.SetColumnsSpan(rc,COULUMNSPANNO)
Grid.SetRowSpan(rc,ROWSPANNO);

im Grid positionieren.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Sorry, ich scheine mich immernoch unklar auszudrücken. Ich versuchs nochmal.

RechnungsControl rc = new RechnungsControl();
grid.Children.Add(rc);

Das ist der Knackpunkt!

Ich kenne an der Stelle nur den Namen, sprich: "RechnungsControl". Er könnte aber auch "BenutzerControl" oder "InfoControl" sein, ergo möchte ich Ihn nicht fest im Code hinterlegen, sondern mal im PseudeCode gesprochen folgendes machen:

var MeinControl = Erstelle.Instanz(string);
grid.Children.Add(MeinControl)

(String ist in dem Fall z.B: "RechnungControl" oder "BenutzerControl" etc.)

Nochmal Danke für eure Mühe und pardon für meine missverständliche Erklärung.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

ICH HABS! 😃

Lösung ist wiefolgt:

 
ObjectHandle returnValue;

returnValue = Activator.CreateInstance("ASSEMBLY-NAME", "ASSEMBLY-NAME.CONTROL_NAME");
var myControl= (UIElement)returnValue.Unwrap();

grdUserControl.Children.Add(myControl);

Danke für eure Hilfe!