【问题标题】:Hit testing on child of InkCanvas对 InkCanvas 的孩子进行命中测试
【发布时间】:2014-06-10 22:48:29
【问题描述】:

我通过代码隐藏向 InkCanvas 添加了一个按钮。由于我无法理解的原因,

    HitTestResult result = VisualTreeHelper.HitTest(pe.InkCanvas.Children[2], point_MouseDown);

按钮的索引为 2,当我点击按钮时,结果总是为空。

有人知道如何判断子元素是否被点击了吗?

任何帮助将不胜感激。 (是的,我已经搜索了互联网但没有成功。如果这看起来是一个愚蠢的问题,我深表歉意)。

系统:Windows 7,.net4.0 WPF C#

编辑:如果我在 Children[0] 是 RichTextBox 的情况下做同样的事情,那么上面的 HitTest 返回非空值。有人知道为什么吗?

编辑:RichTextBox 和 Button 都在代码隐藏中添加,XAML 是:

 <Grid Height="{x:Static local:pe.heightCanvas}" >

            <!--NotepadCanvas. Canvas used to place user writing lines and borders.-->
            <Canvas Name="NotePadCanvas" Panel.ZIndex="0"
                     Width="{x:Static local:pe.widthCanvas}" 
                     Height="{x:Static local:pe.heightCanvas}" 
                     Background="{Binding documenttype, Converter={StaticResource inkCanvasBackgroundConverter}}" />

            <!--BackgroundCanvas. Canvas used for special highlighting of seleted items-->
            <Canvas Name="BackgroundCanvas" Panel.ZIndex="1"
                     Width="{x:Static local:pe.widthCanvas}" 
                     Height="{x:Static local:pe.heightCanvas}" 
                     Background="Transparent" />

            <!--FormsCanvas. Canvas used to place formatted text from lists, etc.-->
            <Canvas Name="FormsCanvas" Panel.ZIndex="2"
                     Width="{x:Static local:pe.widthCanvas}" 
                     Height="{x:Static local:pe.heightCanvas}" 
                     Background="Transparent" />

            <!--TranscriptionCanvas. Canvas used to place recognized ink from the InkAnalyzer-->
            <Canvas Name="TranscriptionCanvas" Panel.ZIndex="3"
                     Width="{x:Static local:pe.widthCanvas}" 
                     Height="{x:Static local:pe.heightCanvas}" 
                     Background="Transparent" />

            <!--InkCanv. Top most canvas used to gather handwritten ink strokes from the user. EditingMode="Ink"   Gesture="OnGesture" -->
            <local:CustomInkCanvas x:Name="InkCanvas" Panel.ZIndex="4" 
                       Width="{x:Static local:pe.widthCanvas}"
                       Height ="{x:Static local:pe.heightCanvas}" 
                       Background="Transparent" 
                       AllowDrop="True"  Drop="InkCanvas_Drop"/>

        </Grid>

【问题讨论】:

  • 你能分享你的 xaml 树吗?所以我们可以看看并尝试模拟。

标签: c# wpf inkcanvas


【解决方案1】:

这可行,但看起来很复杂,我不知道为什么按钮显示为 TextBlock:

...........

  Button btn = new Button();
        btn.Name = "Cancel";
        btn.Content = "Cancel";
        btn.Background = Brushes.Red;
        btn.Width = 50;
        btn.Height = 25;
        btn.RenderTransform = new System.Windows.Media.TranslateTransform(pe.InkCanvas.ActualWidth-btn.Width,topmargin);

        btnCancel = btn;
        pe.InkCanvas.Children.Add(btnCancel);

然后,在 PreviewMouseLeftButtonDown() 中(代码从微软网站稍作修改) ......

// Clear the contents of the list used for hit test results.
                hitResultsList.Clear();


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

                for (int i = 0; i < hitResultsList.Count; i++)
                {
                    TextBlock tb = hitResultsList[i] as TextBlock;
                    if (tb == null) continue;
                    if (tb.Text == "Cancel")
                    {
                        Cancel_Click(); 
                    }
                }

.................................................. ...

List<DependencyObject> hitResultsList = new List<DependencyObject>();

    // 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;
    }

有没有更好的方法?为什么按钮显示为 TextBlock?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多