一点背景:
我正在构建一个窗口,并且我有一个故事板,用于在用户启动的任务完成后简要显示一个弹出窗口,而无需用户确认。它看起来像这样:
<UserControl.Resources>
<Storyboard x:Name="FadingFeedback" x:Key="FadingFeedback" Completed="FadingFeedback_Completed">
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.5"
To="0"
BeginTime="0:0:0"
Duration="0:0:2.0">
<DoubleAnimation.EasingFunction>
<ExponentialEase Exponent="10" EasingMode="EaseIn" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</UserControl.Resources>
我正在使用的弹出窗口定义如下:
<Popup Name="popup" Placement="Center" PopupAnimation="Fade" AllowsTransparency="True"
IsOpen="{Binding DoShowMessage}">
<Popup.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding DoShowMessage}" Value="true">
<Setter Property="Popup.IsOpen" Value="true" />
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource FadingFeedback}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
<Border Background="Black" BorderBrush="White" BorderThickness="1" CornerRadius="5">
<Grid Background="Transparent">
<Grid Name="popupGrid" Background="Black" Grid.Column="0" Grid.Row="0" />
<Label Name="popupLabel" HorizontalAlignment="Center" Foreground="White"
VerticalAlignment="Center"
Background="Transparent"
Grid.Column="0"
Grid.Row="0"
FontSize="16"
Content="{Binding TextMessage}"/>
</Grid>
</Border>
</Popup>
有一个 ViewModel 是它的数据上下文,它有几个属性(在绑定中引用)来提供 TextMessage 字符串和 DoShowMessage 布尔值。它们的定义如下:
private string _textMessage;
public string TextMessage
{
get { return _textMessage; }
set
{
_textMessage = value;
OnPropertyChanged("TextMessage");
}
}
private bool _doShowMessage;
public bool DoShowMessage
{
get { return _doShowMessage; }
set
{
_doShowMessage = value;
OnPropertyChanged("DoShowMessage");
}
}
在适当的时候,ViewModel 将设置DoShowMessage
属性,XAML 中的绑定将显示弹出窗口并开始情节提要。
现在,我Completed
在代码后面的代码中有处理程序,用于执行此操作的弹出窗口:
void StatusFader_Completed(object sender, EventArgs e)
{
popup.IsOpen = false;
}
并且效果很好,并且由于popup.IsOpen
绑定到 ViewModel 上的基础属性DoShowMessage
,它将重置该布尔值。
我的问题是:
情节提要完成后,是否有“更好”的方法来处理 DoShowMessage 属性的重置?或者换一种说法,有没有办法在 XAML 本身中做到这一点?我已经阅读了意见/约定,即背后的代码应该(大部分)没有视图代码,但似乎(至少对我而言)这(事件处理程序)是一种合理的方式来做到这一点。想知道是否有办法在 XAML 中做到这一点。