2012-01-04 66 views
0

我需要在装饰者和装饰控件之间传递一些参数。装饰者和装饰控件之间的交换参数

这是如何做到的?每次参数更改时,我是否应该使用新参数删除并添加新的装饰器?

例如,我的一个参数:

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; 
    } 

在装饰器西塔:

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 2012-01-04 11:31:35

回答

3

下面是一个示例(类型的东西到文本框中,看装饰器):

代码:

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)); 
     } 
    } 
} 

Markup:

<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将它们传递给装饰者。 – ieaglle 2012-01-04 11:30:45

+0

对不起,我不是指ref参数,我的意思是在constrcutor中注入的引用类型(如在常规的CLR对象中,或者甚至是依赖的)。你是否将来自装饰元素的消息传递给Adorner? – 2012-01-04 11:43:06

+0

谢谢,我会尝试... – ieaglle 2012-01-04 12:11:52