5 using System.Windows.Controls;
6 using System.Windows.Data;
8 using SiliconStudio.Core.Mathematics;
10 namespace SiliconStudio.Presentation.Controls
14 private bool interlock;
19 public static readonly DependencyProperty VectorProperty = DependencyProperty.Register(
"Vector", typeof(
Vector3), typeof(
Vector3Editor),
new FrameworkPropertyMetadata(
default(
Vector3), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnVectorPropertyChanged, null,
false, UpdateSourceTrigger.Explicit));
24 public static readonly DependencyProperty XProperty = DependencyProperty.Register(
"X", typeof(
float), typeof(
Vector3Editor),
new FrameworkPropertyMetadata(.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnCartesianPropertyChanged));
29 public static readonly DependencyProperty YProperty = DependencyProperty.Register(
"Y", typeof(
float), typeof(
Vector3Editor),
new FrameworkPropertyMetadata(.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnCartesianPropertyChanged));
34 public static readonly DependencyProperty ZProperty = DependencyProperty.Register(
"Z", typeof(
float), typeof(
Vector3Editor),
new FrameworkPropertyMetadata(.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnCartesianPropertyChanged));
39 public static readonly DependencyProperty LengthProperty = DependencyProperty.Register(
"Length", typeof(
float), typeof(
Vector3Editor),
new FrameworkPropertyMetadata(0.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnPolarPropertyChanged, CoerceLengthValue));
44 public Vector3 Vector {
get {
return (
Vector3)GetValue(VectorProperty); } set { SetValue(VectorProperty, value); } }
49 public float X {
get {
return (
float)GetValue(XProperty); } set { SetValue(XProperty, value); } }
54 public float Y {
get {
return (
float)GetValue(YProperty); } set { SetValue(YProperty, value); } }
59 public float Z {
get {
return (
float)GetValue(ZProperty); } set { SetValue(ZProperty, value); } }
64 public float Length {
get {
return (
float)GetValue(LengthProperty); } set { SetValue(LengthProperty, value); } }
69 private void OnVectorValueChanged()
74 SetCurrentValue(XProperty, Vector.X);
75 SetCurrentValue(YProperty, Vector.Y);
76 SetCurrentValue(ZProperty, Vector.Z);
77 SetCurrentValue(LengthProperty, Vector.Length());
81 UpdateBinding(VectorProperty);
88 private void OnCartesianValueChanged(DependencyPropertyChangedEventArgs e)
93 if (e.Property == XProperty)
94 Vector =
new Vector3((
float)e.NewValue, Vector.Y, Vector.Z);
95 else if (e.Property == YProperty)
96 Vector =
new Vector3(Vector.X, (
float)e.NewValue, Vector.Z);
97 else if (e.Property == ZProperty)
98 Vector =
new Vector3(Vector.X, Vector.Y, (
float)e.NewValue);
100 throw new ArgumentException(
"Property unsupported by method OnCartesianPropertyChanged.");
102 SetCurrentValue(LengthProperty, Vector.Length());
106 UpdateBinding(e.Property);
113 private void OnLengthValueChanged(DependencyPropertyChangedEventArgs e)
122 SetCurrentValue(XProperty,
Vector.X);
123 SetCurrentValue(YProperty,
Vector.Y);
124 SetCurrentValue(ZProperty,
Vector.Z);
128 UpdateBinding(e.Property);
135 private void UpdateBinding(DependencyProperty dependencyProperty)
137 BindingExpression expression = GetBindingExpression(dependencyProperty);
138 if (expression != null)
139 expression.UpdateSource();
147 private static void OnVectorPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
149 var editor = (Vector3Editor)sender;
150 editor.OnVectorValueChanged();
159 private static void OnCartesianPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
161 var editor = (Vector3Editor)sender;
162 editor.OnCartesianValueChanged(e);
170 private static void OnPolarPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
172 var editor = (Vector3Editor)sender;
173 editor.OnLengthValueChanged(e);
179 private static object CoerceLengthValue(
DependencyObject sender,
object baseValue)
181 return Math.Max(0.0f, (float)baseValue);
Represents a three dimensional mathematical vector.
SiliconStudio.Core.Mathematics.Vector3 Vector3