C# 暂停/防止复选框控件的动画
我有一个复选框,它代替了一个类似开关的控件 它工作得很好。唯一的问题是这个复选框初始模式可以是true或false。对于false-没有问题,但如果为true,则在加载视图时,您会立即看到开关移动的动画 我想防止这种情况发生。有没有办法这样做 以下是相关的XAML:C# 暂停/防止复选框控件的动画,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个复选框,它代替了一个类似开关的控件 它工作得很好。唯一的问题是这个复选框初始模式可以是true或false。对于false-没有问题,但如果为true,则在加载视图时,您会立即看到开关移动的动画 我想防止这种情况发生。有没有办法这样做 以下是相关的XAML: <CheckBox Style="{StaticResource MySwitch}" IsChecked="{Binding ExplicitIncludeMode}" ></CheckBox> &
<CheckBox Style="{StaticResource MySwitch}" IsChecked="{Binding ExplicitIncludeMode}" ></CheckBox>
<Style x:Key="MySwitch" TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<ControlTemplate.Resources>
<Storyboard x:Key="OnChecking">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="55"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="OnUnchecking">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(FrameworkElement.Margin)">
<SplineThicknessKeyFrame KeyTime="00:00:00.3000000" Value="1,1,1,1"/>
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<DockPanel x:Name="dockPanel">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" RecognizesAccessKey="True" VerticalAlignment="Center"/>
<Border BorderBrush="LightGray" BorderThickness="1" Margin="5,5,0,5">
<Grid Width="110" Background="GhostWhite">
<TextBlock Text="Included" TextWrapping="Wrap" FontWeight="Medium" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,3,0" Foreground="#FF00AFC4"/>
<TextBlock HorizontalAlignment="Left" Margin="2,0,0,0" FontSize="12" FontWeight="Bold" Text="Excluded" VerticalAlignment="Center" TextWrapping="Wrap" Foreground="#FFE4424D"/>
<Border HorizontalAlignment="Left" x:Name="slider" Width="55" BorderThickness="1,1,1,1" CornerRadius="3,3,3,3" RenderTransformOrigin="0.5,0.5" Margin="1,1,1,1">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Border.RenderTransform>
<Border.BorderBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="WhiteSmoke" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Border.BorderBrush>
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop x:Name="grdColor" Color="#FF00AFC4" Offset="1"/>
<GradientStop Color="#092E3E" Offset="0"/>
</LinearGradientBrush>
</Border.Background>
</Border>
</Grid>
</Border>
</DockPanel>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True"/>
<Condition Property="IsPressed" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource OnUnchecking}" x:Name="OnUnchecking_BeginStoryboard"/>
</MultiTrigger.ExitActions>
<MultiTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource OnChecking}" x:Name="OnChecking_BeginStoryboard"/>
</MultiTrigger.EnterActions>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Width" Value="118"></Setter>
<Setter Property="Height" Value="39"></Setter>
</Style>
找到了一种方法 事实证明,您可以绑定开关/滑块的初始X位置。因此,我将其绑定到ViewModel中的一个属性,并对其进行了更新 对XAML的更改:
<TranslateTransform X="{Binding InitialPosition}" Y="0"/>
ViewModel的属性:
public MonitoredExtensionsViewModel()
{
...
ExplicitIncludeMode = true/false;
InitialPosition = (ExplicitIncludeMode) ? 55 : 0;
...
}
public Double InitialPosition { get; set; }
来自ViewModel的更多信息:
public MonitoredExtensionsViewModel()
{
...
ExplicitIncludeMode = true/false;
InitialPosition = (ExplicitIncludeMode) ? 55 : 0;
...
}
public Double InitialPosition { get; set; }
因此,在加载视图时,将创建viewmodel,并根据复选框状态计算滑块的原始/初始位置。我没有完全重现该问题。如果我将您的代码复制粘贴到一个新的WpfApp中,它将始终显示相同的内容,并且不会使用false或true做出应有的反应。@SimonMourier hmmm如何设置初始复选框状态?是否在为视图调用InitializeComponent之前执行此操作?我只是尝试设置IsChecked=true和false我添加了gif+如何初始化视图+视图模型。另外-尝试将InitializeComponent()放在视图模型的设置之后-没有做任何更改。我只是尝试从头创建一个WPF应用程序,并复制/粘贴了您的代码,没有任何视图模型。