2015-01-25 5 views
0

Я пытаюсь установить свойство зависимостей «WordPad» из Inline-события MouseEnter из CustomTextBlock. Но это ошибка приводит:Как установить свойство зависимости из события InLine текстового блока?

Ссылка на объекте требуется для нестатических полей, методы или свойств «WpfCustomControlLibrary.CustomTextBlock.WordPad.get»

Как я могу добиться этого?

Любая помощь была бы очень признательна. Благодарю.

Учитывая следующий класс:

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 ???? 


    } 

ответ

1

Сделайте inline_MouseEnter и inline_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); 
     } 
    } 
} 
0

Я надеюсь, гуру может дать лучшее решение.

Следует отметить, что Run имеет свойство «Родитель», которое разрешено для этого экземпляра CustomTextBlock. Таким образом, это похоже на работу,

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