如何从文本块的 InLine 事件设置依赖项 属性?

How to set a dependency property from InLine event of a textblock?

我正在尝试从 CustomTextBlock 的 MouseEnter 内联事件中设置依赖项 属性 "WordPad"。但是这个错误结果:

An object reference is required for the non-static field, method, or property 'WpfCustomControlLibrary.CustomTextBlock.WordPad.get'

我怎样才能做到这一点?

如有任何帮助,我们将不胜感激。谢谢

给出以下 class:

 public class CustomTextBlock : TextBlock
{
      public string InLineText
    {
        get { return (string)GetValue(InLineTextProperty); }
        set { SetValue(InLineTextProperty, value); }
    }

     public static readonly DependencyProperty InLineTextProperty =
        DependencyProperty.Register("InLineText", typeof(string), typeof(CustomTextBlock),
            new FrameworkPropertyMetadata(string.Empty,
                FrameworkPropertyMetadataOptions.AffectsMeasure,
                (o, e) =>
                {
                    //PropertyChangedCallback

                    CustomTextBlock tb = (CustomTextBlock)o;
                    string text = (string)e.NewValue;

                    tb.Inlines.Clear();

                    if (String.IsNullOrEmpty(text))
                        return;

                    List<Inline> inlines = new List<Inline>();

                    string[] words = Regex.Split(text, @"(\s+)");

                    Inline inline = null;
                    foreach (string s in words)
                    {
                        Run run = new Run(s);
                        inline = run;
                        inline.MouseEnter += new System.Windows.Input.MouseEventHandler(inline_MouseEnter);
                        inline.MouseLeave += new System.Windows.Input.MouseEventHandler(inline_MouseLeave);
                        tb.Inlines.Add(inline);
                    }
                }));


     public WritingPad WordPad
    {
        get { return (WritingPad)GetValue(WordPadProperty); }
        set { SetValue(WordPadProperty, value); }
    }

     public static readonly DependencyProperty WordPadProperty =
        DependencyProperty.Register("WordPad", typeof(WritingPad), typeof(CustomTextBlock), new UIPropertyMetadata(null));


static void inline_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        Run Sender = sender as Run;
        TextPointer tp0 = Sender.ContentStart;
        TextPointer tp1 = Sender.ContentEnd;

        Rect StartRect = tp0.GetCharacterRect(LogicalDirection.Forward);
        Rect EndRect = tp1.GetCharacterRect(LogicalDirection.Backward);
        StartRect.Union(EndRect);

        WordPad = new WritingPad();   <--**THIS FAILS ????


    }

希望高手能给出更好的解决办法。

应该注意 运行 有一个 "Parent" 属性 解析到 CustomTextBlock 的这个实例。因此,这似乎可行,

  CustomTextBlock ctb = Sender.Parent as CustomTextBlock;
        ctb.WordPad = new WritingPad
        {
            WordBounds = StartRect,
            WritingPadMode = Enumerations.WritingPadModes.EditingByWord
        };

使 inline_MouseEnterinline_MouseLeave 方法成为非静态方法并将它们附加到您的运行中,如下所示:

inline.MouseEnter += tb.inline_MouseEnter;
inline.MouseLeave += tb.inline_MouseLeave;

更好的方法是使整个 PropertyChangedCallback 成为非静态的,然后像这样编写依赖项 属性 声明:

public static readonly DependencyProperty InLineTextProperty =
    DependencyProperty.Register("InLineText", typeof(string), typeof(CustomTextBlock),
        new FrameworkPropertyMetadata(string.Empty,
            FrameworkPropertyMetadataOptions.AffectsMeasure,
            (o, e) => ((CustomTextBlock)o).InlineTextChanged((string)e.NewValue)));

private void InlineTextChanged(string text)
{
    Inlines.Clear();

    if (!string.IsNullOrEmpty(text))
    {
        foreach (string s in Regex.Split(text, @"(\s+)"))
        {
            var run = new Run(s);
            run.MouseEnter += inline_MouseEnter;
            run.MouseLeave += inline_MouseLeave;
            Inlines.Add(run);
        }
    }
}