Referenz auf Usercontrol im Codebehind



  • Guten morgen!
    Ich habe mir ein Usercontrol gebastelt, um Informationen über Produktionsmodule darzustellen. Das funktioniert auch alles wunderbar. Wenn jetzt aber ein Modul ausfällt, möchte ich in dem entsprechenden Usercontrol die Farbe ändern. Ich bekomme jedoch keine Referenz auf das entsprechende Usercontrol.

    Der XAML-Code in dem die Usercontrols dargestellt werden:

    <WrapPanel Name="ModulePanel" Orientation="Vertical">
    <!-- Hier werden die Module angezeigt-->
    </WrapPanel>
    

    Ob ein Modul aktiv ist oder nicht, erfahre ich über UDP-Frames die ich in einem separaten Thread empfange. Meldet sich ein neues Modul, wird ein Usercontrol erstellt und der Gui hinzugefügt:

    private void AddModule(string modulename, string ip, string description)
    		{
    			ModuleInfobox infobox = new ModuleInfobox();
    			infobox.Modulename = modulename;
    			infobox.IpAddress = ip;
    			infobox.Description = description;
    			infobox.Modulenamecolor = "Lime";
    			infobox.Name = modulename;
    			ModulePanel.Children.Add(infobox);
    		}
    
    private void m_backgroundReceive_DoWork(object sender, DoWorkEventArgs e)
    		{
    			// Ist nicht der GUI-Thread, deshalb AddModule und OutputMessage über Dispatcher aufrufen
    			try
    			{
    				... hier empfange ich und werte aus etc. wenn es ein neues Modul ist, füge ich das Control über den Dispatcher der GUI hinzu
    
    							ModulePanel.Dispatcher.BeginInvoke(delAddModule, DispatcherPriority.Normal, module.ModuleName, module.IpAddress, module.Description);
    
    			}
    			catch (Exception ex)
    			{
    				tbl_Status.Dispatcher.BeginInvoke(delOutputMessage, DispatcherPriority.Normal, ex.Message);
    			}
    		}
    

    Die bekannten Module verwalte ich in einer Liste. Jedes Modul hat einen Zeitstempel und wenn der älter als 5 Sekunden ist, will ich die Farbe im Usercontrol auf rot ändern. Das mache ich in einem weiteren Thread.

    private void m_backgroundCheck_DoWork(object sender, DoWorkEventArgs e)
    		{
    			TimeSpan difference;
    			while (isRunning)
    			{
    				lock (m_lock)
    				{
    					foreach (var module in m_knownModules)
    					{
    						difference = DateTime.Now - module.Value.Timestamp;
    						if (difference.TotalSeconds > 5)
    						{
    							module.Value.isActive = false;
    // Hier müsste jetzt noch Code hin, um die Farbe zu ändern...
    						}
    					}
    				}
    			}
    		}
    

    Wie bekomme ich jetzt die Referenz des entsprechenden Usercontrol? Am vielversprechendsten war/ist für mich diese Form: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname%28v=vs.100%29.aspx
    Leider ist mein wantedObject immer null.
    In dem auswertenden Thread würde ich die FindName-Methode wieder über den Dispatcher ausführen, dass aber klappt leider nicht. Der Rückgabewert von DispatcherOperation.Result war immer null. Deshalb habe ich im Gui-Thread folgendes versucht:

    object wantedObject = ModulePanel.FindName(module.ModuleName);
    			if (wantedObject is ModuleInfobox)
    			{
    				OutputMessage("gefunden");
    			}
    

    Aber leider auch immer null als Ergebnis. Abgegraßt habe ich stackoverflow, CodeProject und die MSDN. Leider habe ich keine Lösung gefunden oder mir fallen die falschen Suchbegriffe ein. Hat jemand eine Idee?

    Vielen Dank im voraus!



  • Problem erkannt und gelöst.

    Da die Elemente erst zur Laufzeit erzeugt werden, kann FindName sie im visuellen Baum nicht finden.

    LogicalTreeHelper.FindLogicalNode sucht im logischen Baum, dort finde ich sie nun auch.


Log in to reply