2010-11-29 15 views
2

私は、ユーザーコントロールを定義した:UserControlは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> 

その後、私はTagVisualizationを使用し、カスタム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; 
     } 

問題がある、私は実際に結果でCodeboxが表示されない、だけコードボックスが構成するUI要素(グリッド、ボーダー、サーフェスビュー、その他)しかし、どうすればCodebox自体を手に入れることができますか?

私はTransparentへのユーザーコントロールの背景を設定してみてください真

答えて

2

にisHittestVisibleを設定します。時にはWPF、ヌル({x:null}、デフォルト)に背景が

+1

ヒットテスト容易化を防ぎ、私は「ほとんど常に」と言うのではなく、「時々」と思います。あなたが何かを描かなければ、WPFがテストに合格することはありません。要素のBackgroundまたはFillなどがnullの場合、バックグラウンドで塗りつぶしたり塗りつぶしたりしないようにしてください。したがって、バックグラウンドプロパティを無視している場合、ヌルバックグラウンドでヒットテスト可能性を妨げない*唯一の状況が発生する可能性があります。 –

関連する問題