46 messaggi dal 22 marzo 2012
Buongiorno Lista
ho bisogno di scorrere tutti i controlli posizionati all'interno di una WinForm WPF che hanno la proprieta TAG compilata.

<Label Content="Inserire un codice fiscale" Tag="PROVA"........ />
<Label Content="Inserire il nome" .........../>


Nell'esempio sopra devo trovare la label con il Tag con PROVA.

Ho provato a cercate in rete ma ho trovato tanti esempi ma nessuno che mi desse una mano

Sperando che qualcuno di voi mi possa aiutare invio cordiali saluti

Luca Perini

Perini Luca
204 messaggi dal 08 gennaio 2011
Ciao Luca,
nel codice di esempio vengono controllati tutti i controlli di un elemento Grid di nome g1. Se un controllo ha la proprietà Tag avvalorata viene ricavato il tipo del 'controllo' e il valore della proprietà tag.

For Each x As UIElement In g1.Children
            If Not IsNothing(x.GetValue(TagProperty)) Then
                Select Case x.GetType
                    Case GetType(Label)
                        Dim cx As Label = x
                        Tb1.AppendText("Label " + cx.Name + " " + cx.Tag.ToString + vbCrLf)
                    Case GetType(TextBox)
                        Dim cx As TextBox = x
                        Tb1.AppendText("TextBox " + cx.Name + " " + cx.Tag.ToString + vbCrLf)
                    Case GetType(Button)
                        Dim cx As Button = x
                        Tb1.AppendText("Button " + cx.Name + " " + cx.Tag.ToString + vbCrLf)
                End Select
            End If
        Next


Nell'esempio si suppone che siano d'interesse solo controlli label, TextBox e button.
Modificato da Mario Formosa il 11 luglio 2019 13:43 -
46 messaggi dal 22 marzo 2012
Ciao Mario
grazie per la risposta.
il problema è che io non ho una grid precisa ma dovrei leggere tutti i controlli presenti nella form wpf (preciso che io lavoro in c#)
Ho modificato il tuo codice in modo da utilizzarlo ma dovrei leggere la grid principale e dopo verificare control per control se questo ha dei control annidati al di sotto di se stesso

Es.
GR1 (grid della form
--TABCONTROL (contenitore)
----TEXTBOX (controllo presente in una delle tab)

Pensavo esistesse la possibilità di poter effettuare una select in Linq sulla form wpf per poter trovare i controlli che hanno la proprietà TAG con dei valori inseriti.

Se cosi non fosse allora dovrò trovare il sistema per effettuare una chiamata ricorsiva ad una funzione che controlli control per control se questo ha un sub-control all'intero.

Credo però che questa operazione porti via molto tempo e a questo punto mi conviene fare una funzione private, nella stessa form, nella quale elenco io a mano i control che utilizzano il TAG che però, a mio avviso, è pericolosa in quanto se te ne dimentichi uno avrò un bug di programma.

Sperando di essere stato abbastanza chiaro ringrazio tutti per l'aiuto che mi potrete dare.

Cordiali saluti

Perini Luca
204 messaggi dal 08 gennaio 2011
Ciao Luca,
ho fatto un pò di ricerche nella documentazione ufficiale e sono giunto a questa conclusione che usa LINQ.

 Dim x As Diagnostics.XamlSourceInfo = Diagnostics.VisualDiagnostics.GetXamlSourceInfo(W1)
 Dim xe As XElement = XElement.Load(x.SourceUri.AbsolutePath.ToString.Replace("/", "..\..\"))
 Dim ElementiConTag As IEnumerable(Of XElement) = From el In xe.Descendants
                                                  Select el
                                                  Where Not IsNothing(el.Attribute("Tag"))


W1 è il nome della Window. In xe viene caricato tutto lo Xaml della Window. Non ho capito se c'è un modo migliore per ottenere lo Xaml.

La query Linq seleziona qualsiasi elemento che ha la proprietà Tag.

Spero vada bene.

Scusami se scrivo in VB, ma purtroppo,al momento, non sono troppo a mio agio con C#.

Ciao.
46 messaggi dal 22 marzo 2012
Ciao Mario
Vedo oggi pomeriggio di provarla e, per cortesia, non scusarti se usi VB anzi sono io che devo ringraziarti per l'aiuto visto che sono settimane che ci spacco la testa contro.
Se funziona, anzi, sarà mia cura mettere per i posteri il codice in C# cosi completiamo la tua rispota
Grazie ancora

Cordiali saluti

Perini Luca
204 messaggi dal 08 gennaio 2011
Un esempio di utilizzo dei controlli ricavandoli dagli Xelement.
Vengono selezionati tutti i controlli di tipo Label e poi ne viene cambiato il colore di sfondo.
 Dim LabelsConTag As New List(Of Label)
        For Each xi As XElement In ElementiConTag
            If Not IsNothing(xi.Attribute("{http://schemas.microsoft.com/winfx/2006/xaml}Name")) Then
                If Me.FindName(xi.Attribute("{http://schemas.microsoft.com/winfx/2006/xaml}Name").Value).GetType = GetType(Label) Then
                    LabelsConTag.Add(Me.FindName(xi.Attribute("{http://schemas.microsoft.com/winfx/2006/xaml}Name").Value))
                End If
            End If
        Next
        For Each l As Label In LabelsConTag
            l.Background = New SolidColorBrush(Colors.Red)
        Next


Capisco che il codice potrebbe essere scritto in modo più compatto, però credo che così sia di più facile comprensione.

E' Fondamentale che i vari controlli abbiano un nome.
Modificato da Mario Formosa il 15 luglio 2019 16:49 -
46 messaggi dal 22 marzo 2012
Ciao Mario
Grazie per il codice
Proverò anche questo non appena ripristinata la mia macchina virtuale dove ho l'ambiente di sviluppo che ieri ha deciso in autonomia di scassarsi....
Penso che entro oggi sarò operativo.
Ti faccio sapere
Grazie ancora

Perini Luca
46 messaggi dal 22 marzo 2012
buon pomeriggio

finalmente sono riuscito ad estrarre la struttura della windows dove vorrei fare una semplicissima query LinQ.

Il codice per estrarre i dati è

string xml = XamlWriter.Save(W1);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);


dove W1 è la variabile che passo alla funzione contenente la Window

Se visualizzo e copio quanto presente nella doc.innerXml e lo passo ad un formattatore di xml il risultato è

<MainWindow Title="MainWindow" Name="Pillero" Width="800" Height="450" Visibility="Visible"
    xmlns="clr-namespace:Test;assembly=Test"
    xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <av:Grid Name="G1">
        <av:Grid.ColumnDefinitions>
            <av:ColumnDefinition Width="*" />
        </av:Grid.ColumnDefinitions>
        <av:Grid.RowDefinitions>
            <av:RowDefinition Height="*" />
        </av:Grid.RowDefinitions>
        <av:TabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <av:TabItem IsSelected="True" Header="Web Service">
                <av:Grid Background="#FFE5E5E5">
                    <av:Grid.ColumnDefinitions>
                        <av:ColumnDefinition Width="127" />
                        <av:ColumnDefinition />
                    </av:Grid.ColumnDefinitions>
                    <av:Grid.RowDefinitions>
                        <av:RowDefinition Height="35" />
                        <av:RowDefinition Height="*" />
                    </av:Grid.RowDefinitions>
                    <av:Canvas Name="ciccio" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" av:Grid.Column="0" av:Grid.Row="1" />
                    <av:DataGrid AutoGenerateColumns="True" Name="dgA" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" av:Grid.Column="1" av:Grid.Row="1">
                        <av:DataGrid.ItemBindingGroup>
                            <av:BindingGroup Name="{x:Null}" NotifyOnValidationError="False" ValidatesOnNotifyDataError="True" SharesProposedValues="True" />
                        </av:DataGrid.ItemBindingGroup>
                    </av:DataGrid>
                    <av:Button Name="btWSLanguage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">Language</av:Button>
                    <av:TextBlock Text="da provare" TextWrapping="Wrap" Tag="UTENTE" Name="tbProva" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" av:Grid.Column="1" />
                    <av:Label Tag="UTENTE" Name="lbl" Margin="10,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" av:Grid.Row="1">Label</av:Label>
                </av:Grid>
            </av:TabItem>
            <av:TabItem Header="TabItem">
                <av:Grid Background="#FFE5E5E5" />
            </av:TabItem>
        </av:TabControl>
    </av:Grid>
</MainWindow>


Quello che vorrei fare io (sempre se possibile) eseguire una query LinQ, ma anche passarmi riga per riga il documento per trovarmi il nodo che contiene il valore Tag="" e da questo importarmi in due variabili il valore Name e Tag.

Ho provato anche a creare a runtime lo schema e da quello la classe per poter passare la struttura ma non ci sono riuscito.

Rispetto all'inizio di questa richiesta sono andato avanti (spaccandomi la testa quasi due settimane) e se riuscissi a fare questo avrei quasi concluso il progetto.

Mi appello a voi per un aiuto (lo so che non si può dire per regolamento) ma sto impazzendo.

Ringraziandovi anticipatamente invio cordiali saluti

Perini Luca

Perini Luca

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.