2016-10-07 2 views
0

Wie kann ich alle UIElements an einem bestimmten Punkt in UWP abrufen? Ich möchte alle UIElements erhalten, wenn der Benutzer den Zeiger freigibt (im PointerReleased-Ereignis). Ich habe die VisualTreeHelper.FindElementsInHostCoordinates Methode verwendet, aber es gibt Nullwert zurück.Ermitteln aller UIElements in einem bestimmten Punkt

CS DATEI:

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> 

Vielen Dank für Ihre Hilfe.

Antwort

1

VisualTreeHelper.FindElementsInHostCoordinates gibt eine Aufzählung aller Elemente an einem bestimmten Punkt zurück.

Das PointerReleased-Ereignis enthält die Zeigerposition in seiner PointerRoutedEventArgs. GetCurrentPoint() Methode.

Übergeben Sie das gleiche UIElement (wahrscheinlich Ihre Seite) an GetCurrentPoint und FindElementsInHostCoordinates, damit die Koordinatensysteme übereinstimmen.

+0

Dank Rob. Ich habe diese Methode versucht, aber die Methode gibt null zurück. Ich habe meine Frage bearbeiten können Sie Codes sehen. –

+0

Sie müssen die gleichen Koordinaten verwenden. Sie erhalten den Punkt relativ zur Zeichenfläche und verwenden ihn dann relativ dazu. Verwenden Sie an beiden Stellen das gleiche Element, damit die Koordinaten übereinstimmen. –

+0

Ich habe das versucht, aber das Ergebnis ist dasselbe, diese Methode kehrt immer leer zurück. Ich habe es bereits versucht: PointerPoint p = e.GetCurrentPoint (this.testGrid); var list = VisualTreeHelper.FindElementsInHostCoordinates (p.RawPosition, this.testGrid) als Liste ; –

Verwandte Themen