【问题标题】:StatusBar text fade-out when binding using Caliburn.Micro使用 Caliburn.Micro 绑定时状态栏文本淡出
【发布时间】:2019-08-17 14:56:52
【问题描述】:

在我的ShellViewModel 中,我有以下属性:

private string _status = "";
public string Status
{
    get
    {
        return _status;
    }
    set
    {
        _status = value;
        NotifyOfPropertyChange(() => Status);
    }
}

在 ShellView 中,我将我的 StatusBar TextBlock 命名为“Status”,以便它使用 Caliburn.Micro 绑定到上述内容 - 确实如此。

然后我尝试添加一个“StoryBoard”元素,以便在短时间内文本消失 - 当前文本出现但不会消失 - 我该如何解决这个问题?

<StatusBar DockPanel.Dock="Bottom">

  <TextBlock x:Name="Status">
    <TextBlock.Triggers>
      <EventTrigger RoutedEvent="Binding.TargetUpdated">
        <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                              Duration="0:0:0"
                              To="1.0" />
            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                              Duration="0:0:2"
                              From="1.0"
                              To="0.0"
                              BeginTime="0:0:5" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </TextBlock.Triggers>
  </TextBlock>

</StatusBar>

【问题讨论】:

    标签: c# xaml mvvm caliburn.micro


    【解决方案1】:

    你需要做两处改变,

    首先,您需要更新绑定以在属性更改时引发 TargetUpdated 事件。这可以使用Binding.NotifyOnTargetUpdated来完成

    <TextBlock Text="{Binding Status, NotifyOnTargetUpdated=True}">
    

    然后,您的BeginTime 高于第二个动画中的Duration (BeginTime="0:0:5" ),需要更正。

    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                  Duration="0:0:2" From="1.0" To="0.0" BeginTime="0:0:0.5" />
    

    完整代码

    <TextBlock Text="{Binding Status, NotifyOnTargetUpdated=True}">
                    <TextBlock.Triggers>
                        <EventTrigger RoutedEvent="Binding.TargetUpdated">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                  Duration="0:0:0" To="1.0" BeginTime="0:0:0.5"/>
                                    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                  Duration="0:0:2" From="1.0" To="0.0" BeginTime="0:0:0.5" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                </TextBlock.Triggers>
       </TextBlock>
    

    【讨论】:

    • 感谢 Anu:边走边学!所以从你所说的持续时间是动画的总时间,例如5 秒,然后 BiginTime 在 Duration 期间内......所以我试图在动画已经完成时开始效果?
    • 还有一个问题:我需要两个 DoubleAnimation 元素吗?第一个 DoubleAnimation 元素是多余的吗?
    • @whytheq 这是真的。您需要在持续时间内设置 BeginTime。关于两个双重动画,我认为在这种特殊情况下您不需要两个动画。如果您想先淡入淡出,则可以使用 2 个动画。
    • 再次感谢 Anu - 您是一位耐心的绅士……我是 WPF 的热心新手,所以问了许多幼稚的问题。明天当我可以访问该项目时,我将检查您的解决方案,如果可行,则将其标记为正确答案。我有点担心通过 Caliburn 的自动绑定可能会以某种方式干扰动画的绑定......但希望一切都会好起来。
    • @whytheq 很高兴为您提供帮助。
    猜你喜欢
    • 2014-01-10
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多