2010-12-01 2 views
0

Ich habe einige benutzerdefinierte A-Panels auf einer Leinwand, wo es auch ein B-Panels, wie kann ich zählen A Panels tatsächlich den Mauszeiger?Count Controls von Typ A unter der Maus in WPF

Ich weiß, dass dies mit VisualTreeHelper.HitTest erreicht werden konnte, aber nicht viel Gelegenheit haben, gibt es immer die Elemente auf den benutzerdefinierten Panels oder gar nichts ...

dies mein Code

<UserControl x:Class="WpfApplication7.UserControl1"> 
    <Grid> 
     <Label Content="Label" Height="44" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" FontSize="20" FontWeight="Bold" Width="78" Background="#FF4B9FC4" BorderBrush="#FF020A0D" BorderThickness="1" /> 
    </Grid> 
</UserControl> 

<Window x:Class="WpfApplication7.MainWindow" 
PreviewMouseLeftButtonDown="Window_PreviewMouseLeftButtonDown" xmlns:my="clr-namespace:WpfApplication7"> 
    <Grid> 
     <my:UserControl1 HorizontalAlignment="Left" Margin="82,88,0,0" x:Name="userControl11" VerticalAlignment="Top" /> 
     <my:UserControl1 HorizontalAlignment="Left" Margin="168,166,0,0" x:Name="userControl12" VerticalAlignment="Top" /> 
     <my:UserControl1 HorizontalAlignment="Left" Margin="231,130,0,0" x:Name="userControl13" VerticalAlignment="Top" /> 
    </Grid> 
</Window> 

CS-

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    List<UserControl1> ucs = new List<UserControl1>(); 

    private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     GetUcsCount(e); 
     Console.WriteLine("ucs.Count = {0}", ucs.Count); 
    } 

    private void GetUcsCount(MouseButtonEventArgs e) 
    { 
     ucs.Clear(); 

     Point p = e.GetPosition(this); 

     VisualTreeHelper.HitTest(this, null, 
      new HitTestResultCallback(MyHitTestCallback), 
      new PointHitTestParameters(p)); 
    } 

    HitTestResultBehavior MyHitTestCallback(HitTestResult result) 
    { 
     if (result.VisualHit.GetType() == typeof(UserControl1)) 
     { 
      ucs.Add(result.VisualHit as UserControl1); 
     } 

     return HitTestResultBehavior.Continue; 
    } 
} 

die result == 0 auf eine beliebige Stelle I ...

alt text

Antwort

1

Für jeden in der HitTestResultCallback schlagen können Sie versuchen, die Eltern UserControl1 zu finden und es zu der Liste hinzufügen, wenn es noch nicht hinzugefügt wurde

HitTestResultBehavior MyHitTestCallback(HitTestResult result) 
{ 
    DependencyObject visualHit = result.VisualHit; 
    UserControl1 parentUserControl = GetVisualParent<UserControl1>(visualHit); 
    if (parentUserControl != null && ucs.IndexOf(parentUserControl) < 0) 
    { 
     ucs.Add(parentUserControl as UserControl1); 
    } 
    return HitTestResultBehavior.Continue; 
} 
public static T GetVisualParent<T>(object childObject) where T : Visual 
{ 
    DependencyObject child = childObject as DependencyObject; 
    while ((child != null) && !(child is T)) 
    { 
     child = VisualTreeHelper.GetParent(child); 
    } 
    return child as T; 
} 
+0

danke, observerd ich das auch, aber jetzt gibt es zu viele Elemente zurück :(nicht nur unter der Maus – serhio

+0

@serhio: Ich kann keine Situation finden, wo ich ein Element in der FilterCallback, die nicht unter der Maus ist. Wann ist das passiert? –

+0

@Meleak: Ich verstand, warum myusercontrol transparent war, aber groß, und nur childs Elemente waren wirklich sichtbar .. jetzt suche ich nach einer Methode, die die UserControls nach dem Treffer auf Kind nicht auf dem transparenten Teil zählt ... – serhio

Verwandte Themen