2017-01-23 4 views
0

Ich habe ein C#/WPF-Projekt in Visual Studio 2013. Das Projekt enthält ein Hauptfenster und mehrere Popup-Fenster. Die meisten dieser Popup-Fenster enthalten Steuerelemente, einschließlich Schaltflächen.C# finde alle WPF Windows

Ich muss alle Schaltflächen in allen Fenstern finden, oder eigentlich muss ich finden, was die "IsEnabled" -Eigenschaft für alle Schaltflächen gebunden ist. Im folgenden Code möchte ich "IsChangePwdEnabled" aller Schaltflächen finden/extrahieren.

Der folgende Code ist nur ein Beispiel für ein Fenster und einen Knopf, ich habe 30-40 Fenster in meiner Lösung und alle mit mehreren Tasten auf.

Gibt es eine Lösung, um diese Daten zu extrahieren? Ich habe versucht mit der LogicalTreeHelper.GetChildren(), in der Initialisierung des Programms, aber mit dieser Funktion brauche ich die Parrent des Objekts, das gesucht werden muss, und ich habe das nicht, weil das Fensterobjekt nur erstellt wird wenn gebraucht.

Beispiel der Pop-up-Fenster (Anmeldung):

<window x:Class="ManagedHMI.CLogonDialog" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:ManagedHMI" 
WindowStyle="ToolWindow" 
Topmost="True" 
Title="Logon" SizeToContent="WidthAndHeight" 
> 
<Grid Margin="5,5,5,5" > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
... 
<Button x:Name="ChangePwd" Width="90" Click="ChangePwd_Click" IsEnabled="{Binding Path=IsChangePwdEnabled, UpdateSourceTrigger=PropertyChanged}"> 

-Code, der das Anmeldefenster erstellt:

m_LogonDlg = new CLogonDialog(Logon, UnlockPc, ChangePassword, userDomain, m_language); 

In meinem Programm, das "IsEnabled" Eigenschaft verwendet wird, um zu prüfen, auf welche Tasten ein Benutzer Zugriffsrechte hat, und ich möchte diese Funktionalität verwenden, um einen Export von Benutzerrechten für alle Schaltflächen zu machen.

+0

Als Hinweis, das Setzen von 'Update = PropertyChanged' auf der IsEnabled ist Bindung sinnlos. Die Bindung ist OneWay und aktualisiert daher niemals ihre Quelle. – Clemens

Antwort

0

Sie könnten die Application.Current.Windows -Eigenschaft verwenden, um Verweise auf die Windows zu erhalten, und dann die FindVisualChildren-Methode aus der folgenden Frage verwenden, um alle Steuerelemente eines bestimmten Typs in einem bestimmten Fenster zu finden. Etwas wie folgt aus:

var windows = Application.Current.Windows; 
foreach(var window in windows) 
{ 
    var buttons = FindVisualChildren<Buttons>(window); 
    if(buttons != null) 
    { 
     foreach(var button in buttons) 
     { 
      bool isEnabled = buttons.IsEnabled; 
      //... 
     } 
    } 
} 

Find all controls in WPF Window by type

+0

Das Problem ist, dass "Application.Current.Windows" nur eine Liste der aktuellen (Laufzeit) aktiven Fenster bekommt, und ich brauche eine Liste aller Fenster, die in der Lösung ist, also Fenster, die derzeit nicht aktiv sind (oder erstellt) könnte später bei der Ausführung des Programms erstellt werden. – mkvist

+0

Wie soll man einen Verweis auf ein Fenster erhalten, das noch nicht erstellt wurde? Dies ist in der Tat unmöglich, da es keinen Bezug gibt, bis das Fenster konstruiert ist ... – mm8