J'ai le code suivantHit comportement Test
public partial class MainWindow : Window
{
public MainWindow() {
InitializeComponent();
}
List<UIElement> ucs = new List<UIElement>();
private void Window_PreviewMouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
ucs.Clear();
Point p = e.GetPosition((UIElement)sender);
VisualTreeHelper.HitTest(this, null,
new HitTestResultCallback(MyHitTestCallback),
new PointHitTestParameters(p));
Console.WriteLine("ucs.Count = {0}", ucs.Count);
foreach (var item in ucs)
{
Console.WriteLine("item: {0}", item.ToString());
}
}
HitTestResultBehavior MyHitTestCallback(HitTestResult result)
{
ucs.Add(result.VisualHit as UIElement);
return HitTestResultBehavior.Continue;
}
}
c'est ma fenêtre
<Window>
<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>
c'est mon UC
<UserControl>
<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>
c'est la sortie lorsque je clique sur un utilisateur CONTROL, puis à une intersection de 2 UserControls:
ucs.Count = 2
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
ucs.Count = 3
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
Pourquoi cela? Où est UserControl sous l'instance de la souris?
PS:
Maintenant, quand j'ai sur l'étiquette le BorderThickness = 0
ucs.Count = 3
item: System.Windows.Controls.TextBlock
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
ucs.Count = 3
item: System.Windows.Controls.TextBlock
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
J'ai besoin de compter tous les MyUserControls sous la souris, directement ou indirectement sous le curseur de la souris. IsMouseOver ne retournera vrai que si l'élément est * directement * sous la souris. – serhio
Qu'entendez-vous par "indirectement"? IsMouseOver est documenté comme "incluant les éléments enfants visuels qui sont à l'intérieur de ses limites". Je me demande si vous cherchez un confinement de boîte englobante, auquel cas le test de coup est une mauvaise chose. Pour cela, vous voulez juste VisualTreeHelper.GetDescendantBounds. –
... ou pour le dire autrement, je pense que WPF hit test fait probablement quelque chose de différent de ce que vous voulez. Pourriez-vous décrire ce que vous voulez faire, sans utiliser l'expression «essai de succès» parce que je pense que l'ambiguïté de ce terme est ce qui cause la confusion ici. –