上一个选定的tabitem和选定的tabitem的动画开始工作正常,然后工作不正常.

在我看来,代码应该正常工作.我不知道为什么动画现在不正确.

主窗口.xaml:

<Window.Resources>
        <local:TestViewModel x:Key="vm"/>
        <Style TargetType="{x:Type Rectangle}">
            <Setter Property="Visibility" Value="Visible"/>
            <Setter Property="IsEnabled" Value="True"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="1"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard1">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="40" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="2"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard3">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="75" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard5">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="115" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="0"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard11">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="0" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="2"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard7">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="75" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard9">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="115" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="0"/>

                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard13">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="0" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="1"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard15">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="40" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                        <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard Name="MyBeginStoryboard17">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="115" Duration="0:0:0.2"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
               
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid  DataContext="{StaticResource vm}" >
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TabControl     SelectedIndex="{Binding Selected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"     Grid.Row="0"   x:Name="TestTabs">
            <TabItem Name="Tab1" Header="News" />
            <TabItem Name="Tab2" Header="DLC" />
            <TabItem Name="Tab3" Header="Settings"/>
        </TabControl>
        <DockPanel  x:Name="rp" Grid.Row="0" LastChildFill="False" HorizontalAlignment="Stretch">
            <Canvas DockPanel.Dock="Left" >
                <Rectangle x:Name="Rect1" Fill="#ff0000" VerticalAlignment="Top"  Height="4" Margin="0,25,0,0" 
                           SnapsToDevicePixels="True" UseLayoutRounding="True" RenderOptions.EdgeMode="Aliased" 
                           Width="{Binding ElementName=TestTabs, Path=SelectedItem.ActualWidth}"  RenderOptions.BitmapScalingMode="HighQuality" />
            </Canvas>
        </DockPanel>
        <StackPanel Orientation="Horizontal" Grid.Row="1">
            <Label Content="selected" Width="100" Height="40" />
            <TextBox x:Name="sele" Text="{Binding Selected}" Width="100" Height="40" Background="AliceBlue" Margin="5"/>
            <Label Content="previousSelected"  Width="100" Height="40"/>
            <TextBox x:Name="prev" Text="{Binding PreviousSelected,Mode=OneWay}" Width="100" Height="40" Background="AliceBlue" Margin="5"/>
        </StackPanel>
    </Grid>

主窗口.XAML.CS:

using System.ComponentModel;
using System.Windows;
namespace TabControlBindSlide
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }
  }
  class TestViewModel : INotifyPropertyChanged
  {
    private int _selected;
    public int Selected
    {
      get { return _selected; }
      set
      {
        int temp = _selected;
        _selected = value;
        _previousSelected = temp;
        NotifyPropertyChanged("Selected", temp, value);
        NotifyPropertyChanged("PreviousSelected", temp, temp);
      }
    }
    int _previousSelected = 0;
    public int PreviousSelected
    {
      get { return _previousSelected; }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged<T>(string propertyName, T oldvalue, T newvalue)
    {
      OnPropertyChanged(this, new PropertyChangedExtendedEventArgs<T>(propertyName, oldvalue, newvalue));
    }
    public virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
        handler(sender, e);
    }
  }
  public class PropertyChangedExtendedEventArgs<T> : PropertyChangedEventArgs
  {
    public virtual T OldValue { get; private set; }
    public virtual T NewValue { get; private set; }

    public PropertyChangedExtendedEventArgs(string propertyName, T oldValue, T newValue)
        : base(propertyName)
    {
      OldValue = oldValue;
      NewValue = newValue;
    }
  }

}

结果是:

enter image description here

enter image description here

推荐答案

问题你不应该删除你创建的Storyboard,你应该在完成Storyboard后删除它.因为一个已经存在的Storyboard没有重建,it will only succeed the first time.如果按如下方式渲染所有Storyboards,它将正常工作.

    <Window.Resources>
    <local:TestViewModel x:Key="vm"/>
    <Style TargetType="{x:Type Rectangle}">
        <Setter Property="Visibility" Value="Visible"/>
        <Setter Property="IsEnabled" Value="True"/>
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="1"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard1">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="40" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard1" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="2"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard3">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="75" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard3" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="0"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard5">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="115" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard5" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="0"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard11">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="0" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard11" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="2"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard7">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="75" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard7" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="1"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard9">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="40" To="115" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard9" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="0"/>

                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard13">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="0" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard13" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="1"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard15">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="40" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="MyBeginStoryboard15" />
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding  PreviousSelected }" Value="2"/>
                    <Condition Binding="{Binding ElementName=TestTabs, Path=SelectedIndex}" Value="3"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Name="MyBeginStoryboard17">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="70" To="115" Duration="0:0:0.2"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiDataTrigger.EnterActions>
            </MultiDataTrigger>

        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid  DataContext="{StaticResource vm}" >
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <TabControl     SelectedIndex="{Binding Selected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"     Grid.Row="0"   x:Name="TestTabs">
        <TabItem Name="Tab1" Header="News" />
        <TabItem Name="Tab2" Header="DLC" />
        <TabItem Name="Tab3" Header="Settings"/>
    </TabControl>
    <DockPanel  x:Name="rp" Grid.Row="0" LastChildFill="False" HorizontalAlignment="Stretch">
        <Canvas DockPanel.Dock="Left" >
            <Rectangle x:Name="Rect1" Fill="#ff0000" VerticalAlignment="Top"  Height="4" Margin="0,25,0,0" 
                       SnapsToDevicePixels="True" UseLayoutRounding="True" RenderOptions.EdgeMode="Aliased" 
                       Width="{Binding ElementName=TestTabs, Path=SelectedItem.ActualWidth}"  RenderOptions.BitmapScalingMode="HighQuality" />
        </Canvas>
    </DockPanel>
    <StackPanel Orientation="Horizontal" Grid.Row="1">
        <Label Content="selected" Width="100" Height="40" />
        <TextBox x:Name="sele" Text="{Binding Selected}" Width="100" Height="40" Background="AliceBlue" Margin="5"/>
        <Label Content="previousSelected"  Width="100" Height="40"/>
        <TextBox x:Name="prev" Text="{Binding PreviousSelected,Mode=OneWay}" Width="100" Height="40" Background="AliceBlue" Margin="5"/>
    </StackPanel>
</Grid>

Csharp相关问答推荐

我应该将新的httpReportMessage()包装在using声明中吗?

使用命令初始化可绑定属性

选取器与.NET Maui MVVM的绑定属性

(乌龙)1&#比c#中的UL&#慢吗?

有没有办法使.NET 6应用程序在特定的.NET 6运行时版本上运行

内部接口和类的DI解析

为什么无法将对象转换为泛型类型

如何在NET 8最小API中自动记录TypedResults.Stream响应

如何在用户在线时限制令牌生成?

是否有必要在ASP.NET Core中注册可传递依赖项?

ASP.NET Core MVC将值从视图传递到控制器时出现问题

WPF DataGrid文件名列,允许直接输入文本或通过对话框按键浏览

RX操作员使用先前值进行扫描,信号来自值本身

如何从另一个类的列表中按ID取值

Blazor:搜索框在第一次搜索时不搜索

在同一个捕获中可以有多种类型的异常吗?

如何保存具有多个重叠图片框的图片框?

C#Web服务转换为 node /Express不工作

ASP.NET核心中的验证错误-该字段为必填字段

阻止CLR释放已封送的双字符指针的内存?