Hallo liebe C# Community,
Ich hab jetzt schon gefühlt eine ewigkeit gesucht hab aber zu diesen Thema direkt nichts gefunden.
Ich möchte ein Menü auf der Linken Seite auf und zu klappen. Da ich dies animieren möchte und das ganze über das zugehörige ViewModel gesteuert wird, hab ich ein Datatrigger in den Border gesetzt. Der soll bei Veränderung des Properties die jeweilige Animation starten.
Beim Start der WPF Anwendung funktioniert das wunderbar. Beim zweiten mal wird dieser nicht getriggert ?
Property wird geändert und
View:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:local="clr-namespace:WPFTestApp" x:Class="WPFTestApp.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<DockPanel>
<Border x:Name="LeftMenuBorder" Background="WhiteSmoke" DockPanel.Dock="Left" CornerRadius="0,5,5,0">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="Width" Value="230"/>
<Style.Triggers>
<DataTrigger Binding="{Binding LeftMenuVisible, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="230" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding LeftMenuVisible, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock TextWrapping="Wrap" Text="{Binding LeftMenuVisible}"/>
</Border>
<Border Width="10" Background="Gray">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:CallMethodAction/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
<Grid/>
</DockPanel>
</Window>
ViewModel:
namespace WPFTestApp
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShadowMVVM;
class MainViewModel : BaseViewModel
{
private bool _LeftMenuVisible = false;
public bool LeftMenuVisible
{
get
{
return this._LeftMenuVisible;
}
set
{
this._LeftMenuVisible = value;
this.NotifyPropertyChanged("LeftMenuVisible");
}
}
public void ChangeVisible ()
{
this.LeftMenuVisible = !this.LeftMenuVisible;
}
}
}
Kann ein Datatrigger mehr als einmal angesprochen werden ?
Ich hoffe einer kann mir helfen
Gruß
Jeffrey
Probleme sind zum Lösen da!
Hallo deinChef,
ich kenn mich zwar mit Animations in WPF nicht all zu sehr aus, konnte aber dein Beispiel soweit anpassen, dass es glaub ich das tut, was du willst:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:local="clr-namespace:WPFTestApp" x:Class="WpfApplication1.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<DockPanel>
<Border x:Name="LeftMenuBorder" Background="WhiteSmoke" DockPanel.Dock="Left" CornerRadius="0,5,5,0">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="Width" Value="230"/>
<Style.Triggers>
<DataTrigger Binding="{Binding LeftMenuVisible}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Name="growStoryBoard">
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" From="0" To="230" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="growStoryBoard"></RemoveStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
<DataTrigger Binding="{Binding LeftMenuVisible}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard Name="shrinkStoryBoard">
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="shrinkStoryBoard"></RemoveStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock TextWrapping="Wrap" Text="{Binding LeftMenuVisible}"/>
</Border>
<Border Width="10" Background="Gray">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="ChangeVisible"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
<Grid/>
</DockPanel>
</Window>
Wesentliche Änderungen:
Lg, XXX
Hallo XXX,
Ich danke dir, das mit ExitActions hab ich mir schon gedacht das ich dort noch was definieren muss aber ein RemoveStoryboard wäre mir im leben nicht eingefallen 😁
Funktioniert jetzt alles 😉
Nochmal danke schön!
Gruß
Jeffrey
Probleme sind zum Lösen da!