有没有办法检测屏幕上的运行?

时间:2014-03-11 08:32:39

标签: c# textbox

我有一个包含TextBlock的UserControl。 我想在单击控件时选择TextBlock中最近的Run。 就“最接近鼠标光标”而言,“接近”。 但似乎“运行”不是真正的视觉元素,所以我无法通过PointToScreen获得坐标。它们也不会出现在VisualTreeHelper.GetChild()中。

如果我在TextBox内的每个Run上执行'Mouse.GetPosition(run)',它们都会得到相同的坐标。哪个与我在UserControl上获得的坐标相同。

var coords = Mouse.GetPosition(this); // 110,81.53
var points = runs.Select(run => Tuple.Create(run, Mouse.GetPosition(run)))
             .ToArray(); // Every run has also 110,81.53

那么,关于我如何获得这些运行的屏幕位置的任何想法?

编辑:这是我如何生成运行。

private void CreateRun(FormString s, bool bullet)
{
    var inlines    = _TextBlock.Inlines;            
    var run        = new Run();         
    var binding    = new Binding("SelectorBrush");
    binding.Source = this;

    run.SetBinding(BorderedTextBlock.BorderBrushProperty, binding);

    if (bullet)  
    {
        run.IsEnabled = false;
        run.Text      = "    • ";
    }
    else  
    {
        run.Tag             = s;
        run.FontWeight      = s.IsBold      ? FontWeights.Bold          : FontWeights.Normal;
        run.FontStyle       = s.IsItalic    ? FontStyles.Italic         : FontStyles.Normal;
        run.TextDecorations = s.IsUnderline ? TextDecorations.Underline : null;                     

        if (s.BackgroundColor != null)
            run.Background = new SolidColorBrush((Color)swm.ColorConverter.ConvertFromString(s.BackgroundColor));               
        if (s.Text != null)
            run.Text = s.Text;
    }

    inlines.Add(run);

    if (s.ForegroundColor != null)
        run.Foreground = new SolidColorBrush((Color)swm.ColorConverter.ConvertFromString(s.ForegroundColor));

    if (s.FontSize > 0)
        run.FontSize = s.FontSize;

    if (s.IsTitle)  
    {
        run.FontSize *= 1.2;
        inlines.Add(new LineBreak { Tag = s });
    }
}

0 个答案:

没有答案