获取特定点的所有UIElements

时间:2016-10-07 21:32:12

标签: c# uwp

如何在UWP的特定点获得所有UIElements?我想在用户释放指针时获取所有UIElements(在PointerReleased事件中)。 我使用了VisualTreeHelper.FindElementsInHostCoordinates方法,但它返回null值。

CS文件:

private void  drawingPanel_PointerReleased(object sender, PointerRoutedEventArgs e) 

            PointerPoint endPoint = e.GetCurrentPoint(this.drawingPanel);            
            List<UIElement> list = VisualTreeHelper.FindElementsInHostCoordinates(endPoint.Position, this) as List<UIElement>;              

        }

UI XAML:

 <UserControl  ***** bla bla *****>    

        <UserControl.Resources>  


            <DataTemplate x:Key="ImageTemplate">
                <Viewbox Stretch="UniformToFill" StretchDirection="Both"  >
                    <Grid>
                        <ScrollViewer MinZoomFactor="1" MaxZoomFactor="3" ZoomMode="Disabled"
                                  HorizontalAlignment="Center" VerticalAlignment="Center" 
                                  HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
                            <Image Source="{Binding BlockData}"  Height="{Binding ScreenHeight, Mode=TwoWay}"  Width="{Binding ScreenWidth, Mode=TwoWay}"
                                   Holding="Image_Holding" 
                                   PointerPressed="Image_PointerPressed" />
                        </ScrollViewer>
                    </Grid>
                </Viewbox>
            </DataTemplate>


            <DataTemplate x:Key="TextTemplate" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.HorizontalScrollMode="Disabled">

                <Viewbox Stretch="Uniform" StretchDirection="Both" VerticalAlignment="Top" Grid.Row="1">
                    <RichEditBox  Width="{Binding ScreenWidth, Mode=TwoWay}" Name="richEditor" l:RtfText.RichText="{Binding BlockData}" Margin="0" BorderThickness="0"  IsHitTestVisible="True" IsTapEnabled="True" GotFocus="richEditor_GotFocus" >
                    </RichEditBox>
                </Viewbox>

            </DataTemplate>
            <DataTemplate x:Key="GapTemplate">
                <Grid Height="20" >
                </Grid>
            </DataTemplate>

            <l:NoteTypeTemplateSelector x:Key="NoteTypeTemplateSelector"
            TextTemplate="{StaticResource TextTemplate}"
            ImageTemplate="{StaticResource ImageTemplate}"
            GapTemplate="{StaticResource GapTemplate}">
            </l:NoteTypeTemplateSelector>

        </UserControl.Resources>

        <Grid Name="ContainerGrid" Background="White"  PointerPressed="ContainerGrid_PointerPressed" >
            <Grid.RowDefinitions>

                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
            </Grid.RowDefinitions>
            <ListView  x:Name="NoteList" Background="Transparent" 
                       Grid.Row="1"                     
                       Style="{StaticResource ListViewStyle1}"
                       ItemsSource="{Binding Data}"                 
                       ItemTemplateSelector="{StaticResource NoteTypeTemplateSelector}">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <ContentPresenter/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.ItemContainerStyle>
            </ListView>
            <SwapChainPanel Name="DxPanel"  Grid.Row="1" Visibility="Collapsed"></SwapChainPanel>
            <c:DrawingControl x:Name="drawingPanel"  Grid.Row="1" 
                              Holding="drawingPanel_Holding" 
                              PointerPressed="drawingPanel_PointerPressed"
                              PointerMoved="drawingPanel_PointerMoved"
                              PointerReleased="drawingPanel_PointerReleased"
                              PointerWheelChanged="drawingPanel_PointerWheelChanged"
                              PointerExited="drawingPanel_PointerExited"

                              ManipulationStarted="drawingPanel_ManipulationStarted"
                              ManipulationDelta="drawingPanel_ManipulationDelta" 
                              ManipulationCompleted="drawingPanel_ManipulationCompleted"></c:DrawingControl>
            <c:ReadModeToolbar x:Name="ReadModeToolbar" Grid.Row="0"></c:ReadModeToolbar>
            <c:EditModeToolbar x:Name="EditModeToolbar" Grid.Row="0" Visibility="Collapsed"></c:EditModeToolbar>
            <TextBlock Grid.Row="2" x:Name="InfoText" Text="Offset"></TextBlock>
        </Grid>
    </UserControl>

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

VisualTreeHelper.FindElementsInHostCoordinates将返回特定点上所有元素的枚举。

PointerReleased事件在其PointerRoutedEventArgsGetCurrentPoint()方法中包含指针位置。

将相同的UIElement(可能是你的页面)传递给GetCurrentPoint和FindElementsInHostCoordinates,这样坐标系就会匹配。