如何获得视图元素淡入/淡出基于视图模型属性的值?(How to get View element t

2019-10-16 19:19发布

查看和下面列出的视图模型显示两个按钮:

  • 当您单击显示工具栏 ,工具栏淡入
  • 当您单击隐藏工具栏 ,工具栏淡出

但是,下面的事情不工作:

  • 当应用程序加载和OnPropertyChanged(“PageToolBarVisible”)被触发,如果该值为false,则工具栏显示,尽管这一事实( 这是为什么?)
  • 当应用程序加载和OnPropertyChanged(“PageToolBarVisible”)被解雇,如果该值为true,则工具栏确实淡入 ,然而,这是不应该发生的上载 ,但只有当按下按钮明确改变,所以我改变构造函数来做到这一点:_pageToolBarVisible =“真”,但然后在工具栏仍然还在变淡 ,即使OnPropertyChanged从未叫( 为什么?)

视图:

<Window x:Class="TestAnim334.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:TestAnim334.Commands"
    Title="Main Window" Height="400" Width="800">

    <Window.Resources>
        <Style x:Key="PageToolBarStyle" TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="{Binding PageToolBarVisible}" Value="true">

                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                    Storyboard.TargetProperty="Opacity"
                                    From="0.0" 
                                    To="1.0" 
                                    Duration="0:0:1"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>

                    <DataTrigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                    Storyboard.TargetProperty="Opacity"
                                    From="1.0" 
                                    To="0.0" 
                                    Duration="0:0:1"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>

                </DataTrigger>

                <Trigger Property="Opacity" Value="0">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </Trigger>

            </Style.Triggers>
        </Style>

    </Window.Resources>


    <DockPanel LastChildFill="False">

        <StackPanel DockPanel.Dock="Top"
                    Margin="10">

            <TextBlock Text="This is the content of the page."/>
            <TextBlock Text="The ViewModel property is:"/>
            <TextBlock Text="{Binding PageToolBarVisible}"/>
            <Button Content="Hide ToolBar" 
                    Width="150"
                    Command="{Binding HideToolBarCommand}"
                    HorizontalAlignment="Left"/>
            <Button Content="Show ToolBar" 
                    Width="150"
                    Command="{Binding ShowToolBarCommand}"
                    HorizontalAlignment="Left"/>

        </StackPanel>

        <Border Style="{StaticResource PageToolBarStyle}"
            Height="40"
            DockPanel.Dock="Bottom" Background="#ddd" CornerRadius="5">
            <TextBlock FontSize="24" Text="This is the ToolBar text"/>
        </Border>

    </DockPanel>


</Window>

视图模型:

using System.Windows.Input;
using TestAnim334.Commands;

namespace TestAnim334.ViewModels
{
    public class MainViewModel : ViewModelBase
    {

        #region ViewModelProperty: PageToolBarVisible
        private string _pageToolBarVisible;
        public string PageToolBarVisible
        {
            get
            {
                return _pageToolBarVisible;
            }

            set
            {
                _pageToolBarVisible = value;
                OnPropertyChanged("PageToolBarVisible");
            }
        }
        #endregion

        #region DelegateCommand: HideToolBar
        private DelegateCommand hideToolBarCommand;

        public ICommand HideToolBarCommand
        {
            get
            {
                if (hideToolBarCommand == null)
                {
                    hideToolBarCommand = new DelegateCommand(HideToolBar, CanHideToolBar);
                }
                return hideToolBarCommand;
            }
        }

        private void HideToolBar()
        {
            PageToolBarVisible = "false";
        }

        private bool CanHideToolBar()
        {
            return PageToolBarVisible == "true";
        }
        #endregion

        #region DelegateCommand: ShowToolBar
        private DelegateCommand showToolBarCommand;

        public ICommand ShowToolBarCommand
        {
            get
            {
                if (showToolBarCommand == null)
                {
                    showToolBarCommand = new DelegateCommand(ShowToolBar, CanShowToolBar);
                }
                return showToolBarCommand;
            }
        }

        private void ShowToolBar()
        {
            PageToolBarVisible = "true";
        }

        private bool CanShowToolBar()
        {
            return PageToolBarVisible == "false";
        }
        #endregion

        public MainViewModel()
        {
            PageToolBarVisible = "false";
        }

    }
}

Answer 1:

好回答你的问题的两个部分:

  1. 为什么当PageToolBarVisible在加载工具栏为“假”炒鱿鱼还表示:你唯一的隐藏与动画工具栏上的“ExitActions”,这是不被击中。 该逻辑作为这样流动。

    如果(PageToolBarVisible ==真) 运行EnterActions

    如果(PageToolBarVisible变为假) 运行ExitActions

    如果(PageToolBarVisible开始为假) 什么都不做

    如果(PageToolBarVisible开始为假,并设置为false) 什么也不做

结论,因为PageToolBarVisible不是从真到假变化......动画不运行。

解:

考虑具有处理您PageToolBarVisible财产的假情况下,第二DataTrigger。 或者你可以设置该属性为True,然后假打你ExitActions(虽然我不知道这是否会A)工作或B)是一个很好的解决方案)

  1. 为什么我在设置支持字段的属性加载时仍然运行动画:

    我相信这里发生了什么,是当应用程序加载,绑定是检查属性的值,如果你已经设置的支持字段,那么它应该从收到此值的“获取”的“PageToolBarVisible” 。

    所以,这并不是说你是触发OnPropertyChanged,它的结合是所获得的价值,当你的应用程序是加载

解:

无论是重新考虑你的周围如何结合到触发,因此动画你的逻辑。 或者你可以用绑定模式玩,说实话,我不认为有一个能够满足你正在寻找的条件的方式,但我可能是错的。



文章来源: How to get View element to fade in/out based on value of ViewModel property?