Ich versuche, die ScaleY
Eigenschaft eines LayoutTransform
basierend zu animieren auf einem DataTrigger
zu einem boolean auf meine ViewModel
Klasse gebunden. Die Animation tritt auf, wenn der Wert zuerst von der DataTrigger
(beim ersten Start der Anwendung) als falsch erkannt wird und wenn ich ihn zuerst in einem aktivierten Checkbox-Kontrollkästchen auf true ändere, aber nicht, wenn ich ihn im selben deaktivierten Kontrollkästchen auf false setze.WPF - Verwirrende Datatrigger/Double Verhalten
Eine vereinfachte Version von dem, was ich tue, ist unten aufgeführt.
Die ViewModel-Klasse ist sehr einfach und enthält einen einzelnen booleschen DependencyProperty
namens Selected.
public class VM : DependencyObject
{
public bool Selected
{
get { return (bool)GetValue(SelectedProperty); }
set { SetValue(SelectedProperty, value); }
}
// Using a DependencyProperty as the backing store for Selected. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedProperty =
DependencyProperty.Register("Selected", typeof(bool), typeof(VM), new UIPropertyMetadata(false));
}
Die Window.xaml
enthält einen Knopf und ein Kontrollkästchen. Wenn das Kontrollkästchen aktiviert ist, setze ich die Eigenschaft "Ausgewählt" des ViewModels auf "true" und "false", wenn es nicht markiert ist. Hier ist der Code für das Xaml und sein Code-Behind.
<Window x:Class="DataTriggers.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:y="clr-namespace:DataTriggers"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<y:VM x:Key="VM"/>
<Style TargetType="Button" x:Key="but">
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1"
To="0"
Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Selected}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1"
To="1"
Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<Button Style="{StaticResource but}" DataContext="{StaticResource VM}">
<Button.LayoutTransform>
<ScaleTransform></ScaleTransform>
</Button.LayoutTransform>
me
</Button>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</StackPanel>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
VM vm = this.FindResource("VM") as VM;
vm.Selected = true;
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
VM vm = this.FindResource("VM") as VM;
vm.Selected = false;
}
}
Ich weiß, dass die DataTrigger
wird ausgelöst, wenn die Eigenschaft, weil falsch ist, wenn ich die DoubleAnimation
auf einen einfachen Setter
Betrieb auf der Opacity
Eigenschaft ändern dann sehe ich die richtigen Ergebnisse. Es scheint also ein Problem damit zu sein, wie ich die DoubleAnimation
benutze.
Jede Hilfe würde geschätzt werden.
Das ist in der Tat seltsam. Weiß jemand, warum es so ist? – lbergnehr