2010-12-01 19 views
0

我在畫布上有一些自定義A面板,那裏還有B面板,我該如何計數面板位於鼠標光標實際上?在WPF中的鼠標下計算類型A的控件

我知道,這可能是與​​可以實現,但並沒有多少機會,它總是返回的元素上的自定義面板或什麼都沒有......

這是我的代碼

<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; 
    } 
} 

result == 0無論我點擊...

alt text

回答

1

對於每個打在HitTestResultCallback你可以嘗試尋父的UserControl1和它,如果它尚未

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

謝謝添加添加到列表中,我observerd這個太,但現在它返回太多元素:(不僅在鼠標下面 – serhio 2010-12-01 12:34:35

相關問題