WPF:隐藏对象会导致消失前短暂闪烁

标签 wpf animation data-binding storyboard datatrigger

我有一个简单的按钮样式,它具有绑定(bind)到 bool 属性的数据触发器,如果​​属性为 false,它会使用简单的淡出动画隐藏按钮,反之亦然。

但是由于某种未知的原因,当我第一次执行某些将 bool 值设置为 false 的任务时。它会在淡出之前短暂闪烁。将其设置为 true 后,一切都会按预期进行。

我的风格是

 <Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsButtonVisible}" Value="true">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="Opacity" >
                        <DoubleAnimation Duration="0:0:0.2" To="1"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="Opacity" >
                        <DoubleAnimation Duration="0:0:0.2" To="0"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.ExitActions>
        </DataTrigger>
        <Trigger Property="Opacity" Value="0">
            <Setter Property="Visibility" Value="Collapsed"></Setter>
        </Trigger>
        <Trigger Property="Opacity" Value="1" >
            <Setter Property="Visibility" Value="Visible"></Setter>
        </Trigger>
    </Style.Triggers>
    <Style.Setters>
        <Setter Property="Height" Value="93"/>
        <Setter Property="Width" Value="93"/>
        <Setter Property="Opacity" Value="0"/>
     </Style.Setters>
</Style>

注意:- IsButtonVisible 的默认值为 true

最佳答案

为什么有两个DataTrigger?尝试这个解决方案,也许它可以解决您的问题。

        <Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsVisible}" Value="true">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard FillBehavior="HoldEnd" Storyboard.TargetProperty="Opacity">
                            <DoubleAnimation Duration="0:0:0.2"  To="1"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard Storyboard.TargetProperty="Opacity" >
                            <DoubleAnimation Duration="0:0:0.2"  To="0" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger> 
            <Trigger Property="Opacity" Value="0">
                <Setter Property="Visibility" Value="Collapsed"></Setter>
            </Trigger>
            <Trigger Property="Opacity" Value="1">
                <Setter Property="Visibility" Value="Visible"></Setter>
            </Trigger>
        </Style.Triggers>
        <Style.Setters>
            <Setter Property="Height" Value="93"/>
            <Setter Property="Width" Value="93"/>
            <Setter Property="Opacity" Value="0"/>
        </Style.Setters>
    </Style>

编辑:

XAML
<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="279.716" Width="279.784"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <Style x:Key="ButtonStyleTrue" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding VisibleTrue}" Value="true">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard FillBehavior="HoldEnd" Storyboard.TargetProperty="Opacity">
                            <DoubleAnimation Duration="0:0:0.2"  To="1"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard Storyboard.TargetProperty="Opacity" >
                            <DoubleAnimation Duration="0:0:0.2"  To="0" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
            <Trigger Property="Opacity" Value="0">
                <Setter Property="Visibility" Value="Collapsed"></Setter>
            </Trigger>
            <Trigger Property="Opacity" Value="1">
                <Setter Property="Visibility" Value="Visible"></Setter>
            </Trigger>
        </Style.Triggers>
        <Style.Setters>
            <Setter Property="Height" Value="93"/>
            <Setter Property="Width" Value="93"/>
            <Setter Property="Opacity" Value="0"/>
        </Style.Setters>
    </Style>
    <Style x:Key="ButtonStyleFalse" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding VisibleFalse}" Value="true">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard FillBehavior="HoldEnd" Storyboard.TargetProperty="Opacity">
                            <DoubleAnimation Duration="0:0:0.2"  To="1"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard Storyboard.TargetProperty="Opacity" >
                            <DoubleAnimation Duration="0:0:0.2"  To="0" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
            <Trigger Property="Opacity" Value="0">
                <Setter Property="Visibility" Value="Collapsed"></Setter>
            </Trigger>
            <Trigger Property="Opacity" Value="1">
                <Setter Property="Visibility" Value="Visible"></Setter>
            </Trigger>
        </Style.Triggers>
        <Style.Setters>
            <Setter Property="Height" Value="93"/>
            <Setter Property="Width" Value="93"/>
            <Setter Property="Opacity" Value="0"/>
        </Style.Setters>
    </Style>
</Window.Resources>
<Grid>
    <Button Content="Button" HorizontalAlignment="Left" Margin="187,11,0,0" VerticalAlignment="Top" Width="75" Click="Button_OnClick"/>
    <Button Style="{StaticResource ButtonStyleFalse}" Content="Button" HorizontalAlignment="Left" Margin="47,66,0,0" VerticalAlignment="Top" Width="75"/>
    <TextBlock x:Name="textBlock_true" HorizontalAlignment="Left" Margin="193,68,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
    <Button Style="{StaticResource ButtonStyleTrue}" Content="Button" HorizontalAlignment="Left" Margin="47,143,0,0" VerticalAlignment="Top" Width="75"/>
    <TextBlock x:Name="textBlock_false" HorizontalAlignment="Left" Margin="193,145,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
</Grid>

代码隐藏
using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
public partial class MainWindow : Window, INotifyPropertyChanged
{

    /// <summary>
    /// Initalvalue is true;
    /// </summary>
    public bool VisibleTrue
    {
        get { return _VisibleTrue; }
        set
        {
            if (_VisibleTrue == value) return;
            _VisibleTrue = value;
            textBlock_true.Text = value ? "True" : "False";              
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("VisibleTrue"));
        }
    }
    private bool _VisibleTrue = true;



    /// <summary>
    /// Initialvalue is false
    /// </summary>
    public bool VisibleFalse
    {
        get { return _VisibleFalse; }
        set
        {
            if (_VisibleFalse == value) return;
            _VisibleFalse = value;
            textBlock_false.Text = value ? "True" : "False";
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("VisibleFalse"));
        }
    }
    private bool _VisibleFalse;


    public MainWindow()
    {
        InitializeComponent();

        textBlock_true.Text = "Application started";
        textBlock_false.Text = "Application started";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        VisibleTrue = !VisibleTrue;
        VisibleFalse = !VisibleTrue;
    }
}
}
预览

Preview

关于WPF:隐藏对象会导致消失前短暂闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007276/

相关文章:

c# - 如何在 WPF 中获取以编程方式创建的动态按钮的内容?

wpf - 有没有办法在 Microsoft.Xaml.Behaviors.Wpf 中使用 MVVMLight 的 EventToCommand?

iphone - UIPopoverController 可以在屏幕上移动吗?

c++ - QPropertyAnimation 中支持哪些属性被动画化?

c# - 如何更新进度条使其平稳增加?

WPF 应用程序更改大小

ios - UIPageViewController的setViewControllers方法的动画时长是多少

wpf - 来自 CommandBinding 的 MVVM 调用命令

c# - 带 DataBinder.Eval 的条件运算符

winforms - 将 WinForms ListBox 绑定(bind)到对象属性