Хит-тестирование с новыми UIElements - PullRequest
0 голосов
/ 30 января 2012

Я создаю WPF-usercontrol, который должен проверить, что новые элементы UIE не перекрываются с какими-либо существующими элементами UIE.Приведенный ниже код прекрасно работает, когда baseRectangle добавляется на холст перед вызовом button1_Click, но если в метод button1_Click добавляется прямоугольник, тестирование не работает.

<Window x:Class="WpfCollisionTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas Height="246" HorizontalAlignment="Left" Margin="12,12,0,0" Name="canvas1" VerticalAlignment="Top" Width="479"></Canvas>
        <Button Content="Button" Height="35" HorizontalAlignment="Left" Margin="12,264,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>


 public MainWindow()
 { 
     InitializeComponent();
 }

 private void button1_Click(object sender, RoutedEventArgs e)
 {
     canvas1.Children.Clear();
     Rectangle rect = new Rectangle();
     rect.Width = 200;
     rect.Height = 200;
     rect.Fill = Brushes.Red;
     canvas1.Children.Add(rect);
     if (VisualTreeHelper.HitTest(canvas1, new Point(100, 100)) != null)
     {
         MessageBox.Show("Collision");
     }
 }

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Вызов canvas1.UpdateLayout () до того, как тестирование решит проблему.

0 голосов
/ 30 января 2012

Попробуйте добавить это после добавления прямоугольника на холст:

canvas1.Children.Add(rect);
rect.LayoutUpdated += (s, args) =>
{
    if (VisualTreeHelper.HitTest(canvas1, new Point(100, 100)) != null)
    {
        MessageBox.Show("Collision");
    }
};

Конечно, это будет срабатывать при каждом обновлении макета прямоугольника ... так что вы можете удалить обработчик или выполнить дополнительную проверку внутри него.

...