我有一个包含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 });
}
}