textblock.Inlines.Contain() 命中测试有困难吗?

Difficulty with textblock.Inlines.Contain() with hit testing?

在我的 inkcanvas 的 PreviewMouseDown 事件处理程序中,我对底层 textBlock 进行了命中测试,如下所示。命中测试正确 returns 内联集合的 运行 元素。那么为什么相同的 运行 元素(内联类型)没有被 textBlock 视为 "contained"?

 void CustomInkCanvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {

        CustomInkCanvas cink = sender as CustomInkCanvas;

        TextBlock tb = GetVisualChild<TextBlock>(cink);

        Point p = e.GetPosition(tb);

    /** THIS IS CORRECT AND RETURNS THE CORRECT VALID RUN (of type Inline).
        Run run = tb.InputHitTest(p) as Run;

    ??? BUT DEBUG HERE STATES THAT THE RUN IS NOT CONTAINED BY THE TEXTBLOCK ??
        Debug.Assert(tb.Inlines.Contains(run) != true, "Where is the run?");
  }

提前感谢您对此的任何指导。

运行 可能是其中一个内联的(直接或间接)子元素,因此它本身不是顶级内联集合的元素。

在下面的XAML中,Inlines 集合包含两个元素,一个运行 和一个Bold。另一个 运行 是 Bold 元素的子元素。

<TextBlock>
    <TextBlock.Inlines>
        <Run Text="Hello,"/>
        <Bold>
            <Run Text="World."/>
        </Bold>
    </TextBlock.Inlines>
</TextBlock>