Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WPF中鼠标下A型控件的计数_.net_Wpf_Hittest - Fatal编程技术网

.net WPF中鼠标下A型控件的计数

.net WPF中鼠标下A型控件的计数,.net,wpf,hittest,.net,Wpf,Hittest,我在画布上有一些自定义A面板,其中A面板也有B面板,我如何计算A面板实际位于鼠标光标的位置 我知道这可以通过VisualTreeHelper.HitTest实现,但是没有太多机会,它总是返回自定义面板上的元素,或者根本不返回任何内容 这是我的密码 <UserControl x:Class="WpfApplication7.UserControl1"> <Grid> <Label Content="Label" Height="44" Hori

我在画布上有一些自定义A面板,其中A面板也有B面板,我如何计算A面板实际位于鼠标光标的位置

我知道这可以通过
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

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
列表ucs=新列表();
私有无效窗口\u预览鼠标左键向下(对象发送器,鼠标按钮ventargs e)
{
格图斯孔特(e);
WriteLine(“ucs.Count={0}”,ucs.Count);
}
私有void GetUcsCount(鼠标按钮Ventargs e)
{
ucs.Clear();
点p=e.GetPosition(本);
VisualTreeHelper.HitTest(此,空,
新HitTestResultCallback(MyHitTestCallback),
新的PointHitTestParameters(p));
}
HitTestResultBehavior MyHitTestCallback(HitTestResult结果)
{
if(result.VisualHit.GetType()==typeof(UserControl1))
{
添加(result.VisualHit作为UserControl1);
}
返回HitTestResultBehavior。是否继续;
}
}
结果==0
我单击的任何位置


对于HitTestResultCallback中的每个点击,您可以尝试查找父用户Control1,如果尚未添加,则将其添加到列表中

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;
}
HitTestResultBehavior MyHitTestCallback(HitTestResult)
{
DependencyObject visualHit=result.visualHit;
UserControl1 parentUserControl=GetVisualParent(visualHit);
if(parentUserControl!=null&&ucs.IndexOf(parentUserControl)<0
{
添加(parentUserControl作为UserControl1);
}
返回HitTestResultBehavior。是否继续;
}
公共静态T GetVisualParent(对象子对象),其中T:Visual
{
DependencyObject子对象=作为DependencyObject的子对象;
while((child!=null)&&&!(child是T))
{
child=visualtreeheloper.GetParent(child);
}
返回子对象作为T;
}

谢谢,我也注意到了这一点,但现在它返回的元素太多了:(不只是在mouse@serhio:我在FilterCallback中找不到任何不在鼠标下的元素。这是什么时候发生的?@Meleak:我理解为什么,事实上myusercontrol是透明的,但很大,只有childs元素才是真正可见的。现在,我搜索一个方法,它会在点击儿童而不是透明部分…@serhio:更新了我的答案,如果我理解正确,这应该会让你得到你想要的want@Meleak:为了更好地了解情况,我上传了一张图片,蓝色部分在我的情况下是透明的,这就是为什么我得到了2个控件而不是1个
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;
}