Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[gelöst] String to UIElement
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

[gelöst] String to UIElement

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal am .
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

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
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal am .
private Nachricht | Beiträge des Benutzers