- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一点背景:
我正在构建一个窗口,我有一个 Storyboard ,用于在完成用户启动的任务时简要显示一个弹出窗口,而无需用户确认。它看起来像这样:
<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 是它的数据上下文,它有几个属性(在绑定(bind)中引用)来提供 TextMessage 字符串和 DoShowMessage bool。它们的定义如下:
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 中的绑定(bind)将显示弹出窗口并开始 Storyboard。
现在,我在弹出窗口的代码后面有 Completed
处理程序,它就是这样做的:
void StatusFader_Completed(object sender, EventArgs e)
{
popup.IsOpen = false;
}
这很好用,因为 popup.IsOpen
绑定(bind)到 ViewModel DoShowMessage
的底层属性,它将重置该 bool 值。
我的问题:
Storyboard完成后,是否有“更好”的方法来处理 DoShowMessage 属性的重置?或者换句话说,有没有办法在 XAML 本身中做到这一点?我读过这样一种观点/惯例,即后面的代码应该(大部分)没有 View 代码,但似乎(至少对我而言)这(事件处理程序)是一种合理的方法。想知道在 XAML 中是否有办法做到这一点。
最佳答案
是的,当然你可以用另一种方式来做。通过 ObjectAnimationUsingKeyFrames
设置 popup.IsOpen="False"
。
例如:
Storyboard
<Storyboard x:Name="FadingFeedback" x:Key="FadingFeedback">
<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>
<ObjectAnimationUsingKeyFrames BeginTime="0:0:2.0" Storyboard.TargetProperty="(Popup.IsOpen)">
<DiscreteObjectKeyFrame KeyTime="0:0:0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>False</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<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" />--> <!-- not necessarily, because we have Popup.IsOpen = True -->
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource FadingFeedback}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
...
</Popup>
但是在这种情况下,在动画之外打开Popup
是有问题的,因为动画的属性是第一位的,但是其他来源,比如代码,指定不会。引自 MSDN
:
In order to have any practical effect, an animation of a property must be able to have precedence over the base (unanimated) value, even if that value was set locally.
这样可以通过代码访问,从属性中删除动画,从而允许访问属性,如下所示:
XAML
<Grid>
<Grid.Triggers>
<EventTrigger SourceName="CloseButton" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyPopup"
Storyboard.TargetProperty="(Popup.IsOpen)"
Duration="0:0:0">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Popup x:Name="MyPopup" Width="200" Height="200" IsOpen="True">
<Grid Background="Azure">
<Label Content="Test label" />
</Grid>
</Popup>
<Button Name="OpenButton" Content="OpenButtonFromCode" Width="140" Height="30" Click="OpenButton_Click" />
<Button Name="CloseButton" Content="CloseButtonfromEventTrigger" Width="180" Height="30" Margin="0,80,0,0" />
</Grid>
代码隐藏
private void OpenButton_Click(object sender, RoutedEventArgs e)
{
MyPopup.BeginAnimation(Popup.IsOpenProperty, null);
MyPopup.IsOpen = true;
}
有一个选择,或者干脆在Storyboard_Completed
事件中把False的popup.IsOpen
丢进去,或者做动画,但要访问代码,必须将其删除。
对于我自己,我通常这样做,创建一个附加的依赖属性( bool 值),将触发动画绑定(bind)到这个属性。如果它的值为 true,则启动动画,但它将重新运行,在 Storyboard_Completed
事件中我不得不将属性折叠为 false。就我个人而言,这是一种更简单的方法。
关于c# - 消除代码隐藏中的 Storyboard Completed 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18492448/
代码如下: http://jsfiddle.net/t2nite/KCY8g/ 我正在使用 jquery 创建这些隐藏框。 每个框都有一些文本和一个“显示”和“隐藏”按钮。我正在尝试创建一个“显示/隐
我正在尝试做某事。如果单击一个添加 #add-conferance 然后菜单将显示.add-contact。当点击隐藏然后它显示隐藏。我也将 setTimeout 设置为 7sec,但我希望当我的鼠标
我有一个多步骤(多页?)表单,只要用户按下“下一步”或“上一步”按钮,表单字段就会通过 div 显示和隐藏。 我只想禁用第一个 div (div id="page1"class="pageform")
我有一个使用 IIS 6 和 7 的当前系统,用 ASP.NET 和 .NET 4 中的 C# 编写。 My purpose is to hide the url completely (as per
我正在建立一个网站,并有一个幻灯片。幻灯片有标题和索引,覆盖整个页面。当覆盖被激活时,标题需要消失。当覆盖层被停用时,通过单击退出按钮、缩略图链接或菜单链接,字幕必须返回。 这就是我目前所拥有的
我正在尝试为显示/隐藏功能制作简单的 jquery 代码。但我仍然做错了什么。 $(document).ready(function(){ $('.arrow').click(function
我有一个自定义对话框并使用它来代替 optionMenu。所以我希望 myDialog 表现得像菜单,即在按下菜单时显示/隐藏。我尝试了很多变体,但结果相同: 因为我为 myDialog 设置了一个
在我的项目中,我通过 ViewPager 创建我的 tabBar,如下所示: MainActivity.java mViewPager = (ViewPager) findViewById(R.id.
我目前正在使用一个 Excel 表,我将第 1-17 行分组并在单元格 B18 中写入了一个单元格值。我想知道当我在展开/折叠行时单击 +/- 符号时是否有办法更改 B18 中的值。 例如:我希望 B
我想创建一个按钮来使用 VBA 隐藏和取消隐藏特定组。我拥有的代码将隐藏或取消隐藏指定级别中的所有组: Sub Macro1() ActiveSheet.Outline.ShowLevels RowL
我是 VBA 新手。我想隐藏从任何行到工作表末尾的所有行。 我遇到的问题是我不知道如何编程以隐藏最后写入的行。 我使用下一个函数知道最后写入的单元格,但我不知道在哪里放置隐藏函数。 last = Ra
我想根据另一个字段的条件在 UI 上隐藏或更新一个字段。 例如,如果我有一个名为 Color 的字段: [PXUIField(DisplayName="Color")] [PXStringList("
这是我尝试开始收集通常不会遇到的 GCC 特殊功能。这是@jlebedev 在另一个问题中提到g++的“有效C++”选项之后, -Weffc++ This option warns about C++
我开发了一个 Flutter 应用程序,我使用了 ProgressDialog小部件 ( progress_dialog: ^1.2.0 )。首先,我展示了 ProgressDialog小部件和一些代
我需要在 API 17+ 的同一个 Activity(Fragment) 中显示/隐藏状态栏。假设一个按钮将隐藏它,另一个按钮将显示它: 节目: getActivity().getWindow().s
是否可以通过组件的 ts 代码以编程方式控制下拉列表的显示/隐藏(使用 Angular2 清楚)- https://vmware.github.io/clarity/documentation/dro
我想根据 if 函数的结果隐藏/显示 NiceScroll。 在我的html中有三个部分,从左到右逐一滚动。 我的脚本如下: var section2 = $('#section2').offset(
我有这个 jquery 代码: $(document).ready(function(){ //global vars var searchBoxes = $(".box"); var searchB
这个问题已经有答案了: Does something like jQuery.toggle(boolean) exist? (5 个回答) 已关闭 6 年前。 在 jQuery 中(我当前使用的是 1
我在这样的选择标签上使用 jQuery 的 selectMenu。 $('#ddlReport').selectmenu() 在某些情况下我想隐藏它,但我不知道如何隐藏。 这不起作用: $('#ddl
我是一名优秀的程序员,十分优秀!