我在画布上有一些自定义A面板,其中还有B面板,我怎样才能计数实际上位于鼠标光标的面板?
我知道这可以通过VisualTreeHelper.HitTest
来实现,但没有太多机会,它总是返回自定义面板上的元素,或者根本不返回任何内容......
这是我的代码
<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
我点击的任何地方......
答案 0 :(得分: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;
}