Forum » Programiranje » [WPF] Vrednost Textbox kot "angle" v AxisAngleRotation3D
[WPF] Vrednost Textbox kot "angle" v AxisAngleRotation3D
saule ::
V xaml sem si zrisal kocko, katero obrnem preko AxisAngleRotation3D:
.xaml
.xaml.vb
Zadeva deluje po pričakovanjih, ne znam pa sedaj vključit še vrednosti iz GUI-ja:
.xaml
.xaml.vb
V tem primeru mi vrne error: '20' is not a valid value for property 'To'?
.xaml
<Window.Resources>
<Storyboard x:Key="BoxStoryboard">
<DoubleAnimation Storyboard.TargetName="BoxTransform"
Storyboard.TargetProperty="Angle"
To="20"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
....
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="BoxTransform"
Angle="10"
Axis="0, 0, 1"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Window.Resources>.xaml.vb
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim sbdLabelRotation As Storyboard = DirectCast(FindResource("BoxStoryboard"), Storyboard)
sbdLabelRotation.Begin(Me)
End SubZadeva deluje po pričakovanjih, ne znam pa sedaj vključit še vrednosti iz GUI-ja:
.xaml
<Storyboard x:Key="BoxStoryboard">
<DoubleAnimation Storyboard.TargetName="BoxTransform"
Storyboard.TargetProperty="Angle"
To="{DynamicResource BoxScale}"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>.xaml.vb
Resources.Add("BoxScale", 20)
Dim sbdLabelRotation As Storyboard = DirectCast(FindResource("BoxStoryboard"), Storyboard)
sbdLabelRotation.Begin(Me)V tem primeru mi vrne error: '20' is not a valid value for property 'To'?
saule ::
Tole izgleda, da deluje:
.xaml
.xaml.vb
.xaml
To= "{Binding Path=Test}".xaml.vb
Public Angle As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Me.DataContext = Me
Angle = TextBox1.Text
Dim sbdLabelRotation As Storyboard = DirectCast(FindResource("sbdLabelRotation"), Storyboard)
sbdLabelRotation.Begin(Me)
End Sub
Public Property Test() As String
Get
Return Angle
End Get
Set(ByVal value As String)
Angle = value
End Set
End Property saule ::
Nov dan, nov problem :)
V zgornji rešitvi se pojavi problem, da se na formi ne osveži vrednost spremenljivke, če jo update-am. To pomeni, da se bo prva spremenljivka upoštevala pri klicu storyboard-a, če pa storyboard potem še enkrat pokličem s spremenjeno spremenljivko se bo storyboard sicer zagnal ampak z prejšnjo vrednostjo.
Kot sem bral, je to pač tako narejeno da xaml avtomatično predpostavi, da je vrednost "{Binding Path=spremenljivka}" vedno isti.
Našel sem rešitev, kako se osveži nek objekt (recimo label): BindingOperations.GetBindingExpressionBase(_lblValue, Label.ContentProperty).UpdateTarget(), ni mi pa jasno kako se osveži v mojem primeru, ker na Test nimam ContentProperty-a.
Našel sem tole, ki se mi zdi da je nekako podobno mojemu primeru, samo ne znam zadeve uporabit v praksi:
Kakšna ideja?
V zgornji rešitvi se pojavi problem, da se na formi ne osveži vrednost spremenljivke, če jo update-am. To pomeni, da se bo prva spremenljivka upoštevala pri klicu storyboard-a, če pa storyboard potem še enkrat pokličem s spremenjeno spremenljivko se bo storyboard sicer zagnal ampak z prejšnjo vrednostjo.
Kot sem bral, je to pač tako narejeno da xaml avtomatično predpostavi, da je vrednost "{Binding Path=spremenljivka}" vedno isti.
Našel sem rešitev, kako se osveži nek objekt (recimo label): BindingOperations.GetBindingExpressionBase(_lblValue, Label.ContentProperty).UpdateTarget(), ni mi pa jasno kako se osveži v mojem primeru, ker na Test nimam ContentProperty-a.
Našel sem tole, ki se mi zdi da je nekako podobno mojemu primeru, samo ne znam zadeve uporabit v praksi:
<Object Value="{Binding Path=ComplexValueObject, Converter={StaticResource ComplexValueConverter}, ConverterParameter=PropertyOne}" />
public class ComplexValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ComplexValue cv = value as ComplexValue;
string propName = parameter as string;
switch (propName)
{
case "PropertyOne":
return cv.PropertyOne;
case "PropertyTwo":
return cv.PropertyTwo;
default:
throw new Exception();
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}Kakšna ideja?
Ericssony ::
Če te prav razumem: nastavi Binding Mode na TwoWay.
Več o tem pa tukaj: http://msdn.microsoft.com/en-us/library...
Več o tem pa tukaj: http://msdn.microsoft.com/en-us/library...
saule ::
Problem je bil, ker nisem uporabil INotifyPropertyChanged: http://social.msdn.microsoft.com/Forums...
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | Visual BasicOddelek: Programiranje | 3687 (2713) | cekr |
| » | VB.net Excel v TifOddelek: Programiranje | 1269 (1168) | saule |
| » | Visual Studio - koda za prikaz OS?Oddelek: Programiranje | 1216 (983) | detroit |
| » | [VB] Komunikacija s serijskimi napravamiOddelek: Programiranje | 2484 (1758) | mNeRo |
| » | VB.net MDI in formi splošnoOddelek: Programiranje | 1756 (1699) | strel |