有没有办法在xaml中某处定义动画(例如作为资源),然后多次重复使用?我在不同的数据模板上有很多独立的画笔,它们独立地需要基于数据触发器来启动相同类型的动画.现在,因为动画似乎必须定义Storyboard.TargetName和Storyboard.TargetProperty.这几乎违背了可重用性的目的.我想以某种方式宣称"使用此动画形成资源,但这次将其应用于另一个元素".
对我来说,这似乎是一个相当基本,重要和必要的要求,我很惊讶它不是那么直截了当地表达的.我在这里错过了什么吗?
同样的事情适用于触发器.假设我有许多不同的视觉元素,它们都使用颜色动画表示相同类型的状态.例如,当"活动"在"错误"等时淡入"红色"时淡入绿色.视觉效果之间的唯一区别是它们的形状/视觉树所需的动画行为是相同的,它们在视觉树中的某处都有一个元素具有颜色类型的属性.我认为不难想象一遍又一遍地重新定义相同的动画和数据触发器是多么乏味.每个开发人员都讨厌这个.我拼命寻求一种更简单的解决方案,不需要(或至少很少)c#代码.
到目前为止我得出的是:
在资源中定义动画像这样(对于所有基本状态重复此操作,如激活,激活,非活动,错误):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
Run Code Online (Sandbox Code Playgroud)
在触发器的故事板中使用它(对于每个状态X重复这个数十亿次的每个不同的状态,总是为故事板创建一个新名称):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
您可以很容易地想象我必须为所有那些数以万计的DataTriggers重复复制和粘贴多少臃肿的XAML.
定义所有这些触发器并将其应用于不同的状态视觉效果会很酷.在WPF中如何解决这样的问题?有提示吗?
假设绑定是正确的并且图像文件是它们所处的位置,那么有人能够发现当触发器评估为真时下面的xaml中的图像不会改变的原因吗?
干杯,
Berryl
<Image Source="..\..\Images\OK.png" Grid.Column="2" Stretch="None">
<Image.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding TimeSheet, Converter={StaticResource overQuotaConv}}" Value="True">
<Setter Property="Image.Source" Value="..\..\Images\Error.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Run Code Online (Sandbox Code Playgroud) 我有一个网格,其行需要根据视图模型动态调整大小.我想做类似以下的事情:
<RowDefinition Height="2*">
<RowDefinition.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ShowSection}" Value="True">
<Setter Property="RowDefinition.Height" Value="2*"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=ShowSection}" Value="False">
<Setter Property="RowDefinition.Height" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
Run Code Online (Sandbox Code Playgroud)
这个编译,没有错误,但似乎没有任何影响.有没有我缺少的东西,或者Grid在绘制表单后不允许其行调整大小或者是什么?
我的视图模型公开了一个名为MyList空的列表null.我有一个基于这个状态隐藏的元素.如果MyList为空或null,则该元素应折叠.如果它有元素则应显示.
这是我的DataTrigger:
<DataTrigger Binding="{Binding MyList.Count, FallbackValue=0}" Value="0">
<Setter Property="Visibility" Value="Collapsed"></Setter>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
DataTrigger时候MyList是null?FallbackValue还是会失败?我今天似乎很难过.我想要做的就是TextBox根据bool值数据绑定到其托管的Window中隐藏可见.
我刚才不会编译,我不明白为什么.请帮忙.
<TextBlock Grid.Column="2" Text="This order will be sent to accounting for approval"
Foreground="Red" VerticalAlignment="Center" FontWeight="Bold" Padding="5">
<TextBlock.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=AllowedToSubmit}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud) 我如何定义DataTrigger一个StackPanel?它有一个Trigger属性,但是在这里定义一个触发器在启动应用程序时在Initialize上给出以下错误:
对象初始化失败(ISupportInitialize.EndInit).触发器集合成员必须是EventTrigger类型.....
这由以下简单给出DataTrigger:
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
<StackPanel.Triggers>
<DataTrigger Binding="{Binding Id}" Value="1">
<Setter TargetName="PersonPanel" Property="StackPanel.Background" Value="Green" />
</DataTrigger>
</StackPanel.Triggers>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这是我的第Trigger一次,所以我做错了什么?我应该在Trigger其他地方定义吗?
我想在我的绑定表字段时将我的图像Visibility属性设置为隐藏
Weblink = NULL **OR** Weblink = ""
Run Code Online (Sandbox Code Playgroud)
使用MultiDataTrigger,您可以在以下逻辑中测试几个条件:
"IF FieldA = 1 **AND** FieldB = 2 THEN"
Run Code Online (Sandbox Code Playgroud)
但我需要的是
"IF FieldA = 1 **OR** FieldA = 2 THEN"
Run Code Online (Sandbox Code Playgroud)
这是我的xaml whitch的一部分,只有在Weblink =""时才能工作; 当Weblink = NULL时,我的图像保持可见
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Weblink}" Value="Null">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
<DataTrigger Binding="{Binding Weblink}" Value="">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
Run Code Online (Sandbox Code Playgroud)
提前致谢 !Spoelle
我有一个通用控件,它根据ViewModel中的type属性显示一个编辑器.目前它已经实现使用Control,ControlTemplate并且DataTrigger像这样 -
<Control
x:Name="MainControl"
Grid.Column="1"
TargetUpdated="OnTargetUpdated">
<Control.Style>
<Style>
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Bool}">
<Setter
Property="Control.Template"
Value="{StaticResource boolTemplate}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Text}">
<Setter
Property="Control.Template"
Value="{StaticResource textTemplate}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Integer}">
<Setter
Property="Control.Template"
Value="{StaticResource integerTemplate}" />
</DataTrigger>
...
....
</Style.Triggers>
</Style>
</Control.Style>
</Control>
Run Code Online (Sandbox Code Playgroud)
现在,同样可以利用来实现ContentPresenter,DataTemplate而DataTemplateSelector这样的-
<local:EditorTemplateSelector
BoolEditorTemplate="{StaticResource boolTemplate}"
TextEditorTemplate="{StaticResource textTemplate}"
IntegerEditorTemplate="{StaticResource integerTemplate}"
...
....
x:Key="EditorTemplateSelector">
</local:EditorTemplateSelector>
<ContentPresenter
ContentTemplateSelector="{Binding Source={StaticResource EditorTemplateSelector}}"
Content="{Binding}"
TargetUpdated="OnTargetUpdated">
</ContentPresenter>
// …Run Code Online (Sandbox Code Playgroud) wpf datatrigger datatemplate controltemplate datatemplateselector
我有一个标签,我只根据我的一个ViewModel属性显示.这是XAML:
<Label HorizontalAlignment="Center" VerticalAlignment="Center"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
FontSize="24" Width="200" Height="200" >
<Label.Content >
Option in the money!
</Label.Content>
<Label.Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger Binding="{Binding OptionInMoney}" Value="True">
<Setter Property="Visibility"
Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
Run Code Online (Sandbox Code Playgroud)
我不确定这是最好的方法,但无论如何,我也想让标签闪烁.显然,我只希望它在可见时闪烁.有人能指点我一些示例代码,或写一个快速示例来做到这一点?我假设我需要某种触发器和动画.据推测,当标签不再可见时我还需要一个触发器,以便停止动画?
谢谢,戴夫PS是否有一本好的书或网站所有这些WPF技巧?像那些记得那本书的人那样的"MFC答案书".
我正在尝试DataTrigger为Image元素定义一个元素,以便它显示连接/断开连接的图像.我不断收到Invalid PropertyDescriptor消息.有任何想法吗?
<Image>
<Image.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static my:Server.Instance}, Path=Connected, Mode=OneWay}"
Value="True">
<Setter Property="Source"
Value="serverconnected.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Run Code Online (Sandbox Code Playgroud) datatrigger ×10
wpf ×10
.net ×2
animation ×2
styles ×2
triggers ×2
.net-3.5 ×1
c# ×1
data-binding ×1
datatemplate ×1
grid ×1
image ×1
resources ×1
reusability ×1
stackpanel ×1
xaml ×1