Newsgroup: it.comp.dotnet
Titolo: Wpf,qualche domanda su listbox

Ciao a tutti,
lo so che e' venerdi', ma anche oggi devo fare qualche domandina....
Ho una listbox Wpf, che visualizza degli elementi, istanze di una mia 
classe, tramite un template.
Naturalmente questa listbox e' scrollabile, e potrebbero esserci, 
all'interno, piu' di un centinaio di elementi, e quelli mostrati in un 
determinato istante, per le dimensioni della listbox stessa, non sono piu' 
di una decina.
Prima domanda: ammettiamo che scrollando la mia listbox abbia, come primo 
elemento visualizzato, il numero 120; posso creare una procedura che, ad 
esempio, imposti il primo elemento visibile al numero 25?
Seconda domanda: Ho notato che, a differenza di quanto accadeva in Winfom, 
se faccio doppio click sulle barre di scorrimento, viene comunque alzato 
l'evento MouseDoubleClick. Come potete immaginare, nella stragrande 
maggioranza dei casi, questo comportamento non e' quello che si vuole. E' 
possibile fare in modo che se il doppio click non e' stato fatto 
"all'interno" del controllo, l'evento non venga alzato o venga scartato?
Ho provato a dare un'occhiata all'argomento di tipo 
System.Windows.Input.MouseButtonEventArgs che viene passato dall'evento 
stesso, ma non ho trovato nulla di utile.
Grazie a tutti e buon week-end... Maurizio

 posso creare una procedura che, ad
esempio, imposti il primo elemento visibile al numero 25?
...
Basta usare il metodo ScrollIntoView della ListBox, passando come argomento, 
l'oggetto (da recuperare nella collezione Items tramite l'indice) che si 
vuole vedere
Adesso resta aperta la seconda domanda :-)
Ciao ancora... Maurizio

 Grazie a tutti e buon week-end... Maurizio
Prova con HitTesting:
            Point pt = e.GetPosition((UIElement)sender);
            HitTestResult hr = VisualTreeHelper.HitTest(listBox1, pt);
            if (hr != null)
            {
                FrameworkElement elemento = hr.VisualHit as
FrameworkElement;
                while ((elemento is ListBoxItem) == false && elemento !
= null)
                {
                    elemento = VisualTreeHelper.GetParent(elemento) as
FrameworkElement;
                }
                if (elemento != null)
                {
                    MessageBox.Show((elemento as
ListBoxItem).Content.ToString());
                }
            }
Ciao
Fabio

 stesso, ma non ho trovato nulla di utile.
Oltre a qello che ti ha detto Fabio la proprietà ti dice chi è il 
controllo che ha effettivamente scatenato il doppio click.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

Prova con HitTesting:
[...]
...
Meglio di cosi' non puo' andare.... funziona, ho capito cosa fa e sono anche 
stato in grado di tradurlo da C sharp a 
vb.net
.
Per oggi ho avuto abbastanza, dalla giornata :-)

che ha effettivamente scatenato il doppio click.
...
Se intendi la proprieta' Source di 
System.Windows.Input.MouseButtonEventArgs, si lo avevo visto.. ma quello mi 
dice chi e' il "parent" che ha alzato l'evento, cioe' nel mio caso la 
ListBox (e quello gia' lo sapevo).
Intendevi forse altro?
Ciao e grazie ancora... Maurizio 

Ciao vbMizio,

mi sono perso un pezzo del messaggio: OriginalSource


mi sono perso un pezzo del messaggio: OriginalSource
...
Ecco, questo e' quello che cercavo di fare prima della soluzione proposta da 
Fabio, solo che ho un dubbio...
Quando faccio doppio click sulla scrollbar, la proprieta' OriginalSource 
contiene un oggetto di tipo System.Windows.Shapes.Rectangle
Immagino quindi che per scartare il doppio click, e' sufficiente andare a 
verificare di che tipo e' l'oggetto contenuto in OriginalSource... Ci sono 
altri casi in cui e' possibile che l'oggetto sia di questo tipo?
Un caso che  mi viene in mente e' se effettivamente ho disegnato un 
Rectangle all'interno del template.
Forse e' piu' "error-proof" l'approccio suggerito da Fabio?
Grazie ancora a tutti... Maurizio

 Forse e' piu' "error-proof" l'approccio suggerito da Fabio?
OriginalSource è l'elemento nel tree (sinceramente non ricordo se 
visual o logical in questo momento, ma propendo per Visual Tree) che ha 
effettivamente scatenato l'evento, nel tuo caso quello su cui hai fatto 
doppio click. Partendo da li adotti la tecnica di Fabio e scorri 
all'indietro il tree di elementi e se il primo che trovi è un 
ListBoxItem significa che l'utente ha fatto doppio click su uno degli 
item, altrimenti quando trovi la ListBox ti puoi fermare perchè 
significa che ha fatto doppio click su altri elementi della ListBox 
stessa.
Okkio che il tutto si complica se customizzi il template degli item e 
hai bisogno di gestire internamente al template un controllo che a sua 
volta ha il concetto di doppio click.


OriginalSource è l'elemento nel tree (sinceramente non ricordo se
visual o logical in questo momento, ma propendo per Visual Tree) che ha
effettivamente scatenato l'evento, nel tuo caso quello su cui hai fatto
doppio click. Partendo da li adotti la tecnica di Fabio e scorri
all'indietro il tree di elementi [...]
...
In effetti sto provando a mixare cio' che ha scritto Fabio, con quello che 
mi stai dicendo tu.
Per far questo, casto l'oggetto restituito dalla proprieta' OriginalSource 
verso FrameworkElement, poi adotto la tecnica suggerita da Fabio.
Sembrerebbe funzionare :-)