2012-01-04 2 views
0

Мне нужно передать некоторые параметры между adorner и украшенным контролем.Параметры обмена между adorner и украшенным управлением

Как это можно сделать? Должен ли я удалять и добавлять нового adorner с новыми параметрами при каждом изменении параметров?

Например, один из моих параметров:

public static readonly DependencyProperty ThetaProperty = 
     DependencyProperty.Register("Theta", typeof (double), typeof (SplitControl), new PropertyMetadata(default(double), SetTheta)); 

    public double Theta 
    { 
     get { return (double) GetValue(ThetaProperty); } 
     set { SetValue(ThetaProperty, value); } 
    } 

    private static void SetTheta(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     _adorner.Theta = (double) e.NewValue; 
    } 

В Adorner Тета:

public double Theta 
    { 
     get 
     { 
      return (Math.Atan(((_middleTop - _middleBottom)/AdornedElement.DesiredSize.Height))) * 180/Math.PI; 
     } 
     set 
     { 
      double deltaX = (Math.Tan((Math.PI/180)*value))*(AdornedElement.DesiredSize.Height/2); 
      _middleTop = _middle + deltaX; 
      _middleBottom = _middle - deltaX; 
     } 
    } 
+0

Какие параметры вы хотите передать, можете ли вы привести пример, пожалуйста, и уточните подробнее об этом? Поскольку у вас есть ссылка на украшенный UIElement, вы должны иметь доступ к наиболее релевантной информации из этого. – SvenG

ответ

3

Вот образец (типа что-то в текстовое поле и смотреть Adorner):

код :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Globalization; 

namespace Adorners 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      this.Loaded += (o, e) => 
      { 
       AdornerLayer layer = AdornerLayer.GetAdornerLayer(this.t); 

       MyAdorner myAdorner = new MyAdorner(this.t); 

       layer.Add(myAdorner); 

       this.t.Text = "Modified Value"; 
      }; 
     } 
    } 


    public class MyAdorner : Adorner 
    { 
     public static DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", 
      typeof(string), 
      typeof(MyAdorner), 
      new PropertyMetadata("Default Text", 
      (o, e) => 
      { 
       ((MyAdorner)o).InvalidateVisual(); 
      })); 

     // Be sure to call the base class constructor. 
     public MyAdorner(UIElement adornedElement) 
      : base(adornedElement) 
     { 
      this.DataContext = this.AdornedElement; 

      this.SetUpBindings(); 
     } 

     private void SetUpBindings() 
     { 
      BindingOperations.SetBinding(this, 
       MyAdorner.TextProperty, 
       new Binding() 
       { 
        Path = new PropertyPath("Text"), 
        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
       }); 
     } 

     public string Text 
     { 
      get { return (string)this.GetValue(MyAdorner.TextProperty); } 
      set { this.SetValue(MyAdorner.TextProperty, value); } 
     } 

     protected override void OnRender(DrawingContext drawingContext) 
     { 
      Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize); 

      drawingContext.DrawText(new FormattedText(this.Text, CultureInfo.CurrentCulture, 
       FlowDirection.LeftToRight, 
       new Typeface("Arial"), 
       20, 
       Brushes.Black), 
       new Point(0, 150)); 
     } 
    } 
} 

Разметка:

<Window x:Class="Adorners.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid x:Name="AdornedGrid"> 
     <TextBox x:Name="t" Width="200" Height="100" Background="Green"></TextBox> 
    </Grid> 
</Window> 
+0

Мои параметры - это свойства зависимостей, поэтому я не могу использовать ref, чтобы передать их adorner. – ieaglle

+0

Извините, я не имел в виду параметры ref, я имел в виду ссылочные типы (как в обычных CLR-объектах, так и даже в зависимостях), введенных в constrcutor. Вы передаете сообщение от украшенного элемента Adorner? –

+0

Спасибо, я попробую ... – ieaglle