2010-11-29 9 views
2

definiert ich eine Usercontrol:Ist ein UserControl nicht im HitTestResult?

<s:SurfaceUserControl x:Class="Prototype_Concept_1.CodeBox" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:s="http://schemas.microsoft.com/surface/2008"> 
    <Grid> 

      <Viewbox> 
       <s:SurfaceScrollViewer Margin="10,10,10,10" 
     x:Name="scroll" 
     Width="250" 
     Height="250" 
     VerticalScrollBarVisibility="Visible" 
     HorizontalScrollBarVisibility="Visible" 
     CanContentScroll="True"> 
        <RichTextBox 
      Name="TextInput" 
      AcceptsReturn="True" 
       TextChanged="TextChangedEventHandler" 
      Width="350" 
      ScrollViewer.VerticalScrollBarVisibility="Hidden" 
      ScrollViewer.HorizontalScrollBarVisibility="Hidden"> 
         <RichTextBox.Document> 
          <FlowDocument Name="flowDocument"> 
          </FlowDocument> 
         </RichTextBox.Document> 
         <RichTextBox.Resources> 
          <Style TargetType="{x:Type Paragraph}"> 
           <Setter Property="Margin" Value="0"/> 
          </Style> 
         </RichTextBox.Resources> 
        </RichTextBox> 
       </s:SurfaceScrollViewer> 
      </Viewbox> 

    </Grid> 
</s:SurfaceUserControl> 

i Dann mit einem TagVisualization und tun eine benutzerdefinierte hitTest:

private void TagVisualizer_VisualizationAdded(object sender, TagVisualizerEventArgs e) 
     { 

      Point pt = e.TagVisualization.Center; 

      // Perform the hit test against a given portion of the visual object tree. 
      hitResultsList.Clear(); 

      // Set up a callback to receive the hit test result enumeration. 
      VisualTreeHelper.HitTest(MainGrid, 
           null, 
           new HitTestResultCallback(MyHitTestResult), 
           new PointHitTestParameters(pt)); 

      // Perform actions on the hit test results list. 
      if (hitResultsList.Count > 0) 
      { 
       Console.WriteLine("Number of hits: " + hitResultsList.Count); 
       foreach (DependencyObject o in hitResultsList) 
       { 

        if (e.TagVisualization is LoupeTagVisualization) 
        { 
         if (o.GetType() == typeof(Ellipse)) 
         { 
          Console.WriteLine(((o as Ellipse).Tag as SourceFile).getName()); 

          CodeBox cb = new CodeBox(); 

          MainScatter.Items.Add(cb); 



          break; 
         } 
        } 
        else if (e.TagVisualization is BinTagVisualization) 
        { 
         Console.WriteLine("BinTagVisualization"); 
         Console.WriteLine(o.GetType()); 
         if (o.GetType() == typeof(CheckBox)) 
         { 
          (o as CheckBox).Visibility = System.Windows.Visibility.Collapsed; 
         } 
        } 
       } 
      } 


     } 

     // Return the result of the hit test to the callback. 
     public HitTestResultBehavior MyHitTestResult(HitTestResult result) 
     { 
      // Add the hit test result to the list that will be processed after the enumeration. 
      hitResultsList.Add(result.VisualHit); 

      // Set the behavior to return visuals at all z-order levels. 
      return HitTestResultBehavior.Continue; 
     } 

Das Problem ist, kann ich eigentlich nicht die Codebox in den Ergebnissen sehen, nur die UI-Elemente (Grid, Border, Surferscrollviewer usw.), aus denen die Codebox besteht. Aber wie bekomme ich die Codebox selbst?

Ich habe IsHitTestVisible auf true

Antwort

2

Versuchen der Benutzer die Kontrolle der Hintergrund Transparent Einstellung. Manchmal in WPF verhindert ein Null ({x:null}, der Standard) Hintergrund Hit-Testability

+1

Ich würde sagen "fast immer" anstatt "manchmal". Wenn du etwas nicht zeichnest, dann gibt es für WPF nichts, was den Test angeht, und wenn der Hintergrund oder die Füllung eines Elements Null ist, dann wirst du effektiv gebeten, nicht im Hintergrund zu malen oder zu füllen. Die einzige Situation, in der ein Null-Hintergrund die Hit-Testability nicht verhindern kann, ist, dass das Element die Hintergrund-Eigenschaft ignoriert. –

Verwandte Themen