2012-01-04 4 views
0

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

어떤 매개 변수를 전달 하시겠습니까? 예제를 작성하고 이에 대해 자세히 설명해 주시겠습니까? 장식 된 UI 요소에 대한 참조가 있으므로 가장 관련있는 정보에 액세스 할 수 있어야합니다. – 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 매개 변수를 의미하지는 않습니다. constrcutor에 삽입 된 참조 유형 (일반 CLR 객체 또는 종속성 요소)을 의미했습니다. 당신은 장식 된 요소에서 Adorner에게 메시지를 전달하고 있습니까? –

+0

감사합니다. 시도해 보겠습니다 ... – ieaglle