Behavior介紹
WPF Behavior
前提條件
- 下載Wpf Behavior庫 - Microsoft.Xaml.Behaviors.Wpf
tip: b 是我對應Behavior的代號xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
介紹
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:CallMethodAction MethodName="Method" TargetObject="{Binding}" />
</b:EventTrigger>
</b:Interaction.Triggers>
這是一個常見的用法,Iteraction類中定義了兩個依賴屬性
- Triggers
- Behaviors
源碼
private static readonly DependencyProperty TriggersProperty = DependencyProperty.RegisterAttached("ShadowTriggers",typeof(TriggerCollection),typeof(Interaction),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnTriggersChanged)));
private static readonly DependencyProperty BehaviorsProperty = DependencyProperty.RegisterAttached("ShadowBehaviors", typeof(BehaviorCollection),typeof(Interaction),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnBehaviorsChanged)));
Trigger
Trigger的類型為TriggerCollection,可以為其添加多個TriggerBase,Behavior包為我們提供了多種Trigger,一下介紹一些常用的Trigger
EventTrigger
事件觸發,EventName為事件名稱,SourceObject為觸發事件的對象,默認為附加的依賴屬性
<b:EventTrigger EventName="Click" SourceObject="{Binding ElementName=button}"/>
DataTrigger
數據觸發,Binding為綁定數據,Value為綁定數據中的值,當Binding的值等于Value時觸發
<b:DataTrigger Binding="{Binding ElementName=checkBox, Path=IsChecked}" Value="true" />
PropertyChangedTrigger
屬性改變觸發,Binding為綁定數據,當Binding的值改變時觸發
<b:PropertyChangedTrigger Binding="{Binding ElementName=checkBox, Path=IsChecked}"/>
Action
CallMethodAction
調用方法,MethodName為方法名稱,TargetObject為方法所屬的對象,默認為附加的依賴屬性
<b:CallMethodAction MethodName="Method" TargetObject="{Binding Object}" />
InvokeCommandAction
<b:InvokeCommandAction Command="{Binding TestActiveCommand}" />
ControlStoryboardAction
ControlStoryboardAction表示將在執行時更改指定Storyboard狀態的操作。使用此行為可以使用ControlStoryboard屬性觸發和控制指定的Storyboard
ControlStoryboardOption 枚舉
| 方法名稱 | 描述 |
|---|---|
| Start | 開始播放動畫 |
| Stop | 停止播放動畫 |
| Pause | 暫停播放動畫 |
| Resume | 恢復播放動畫 |
| SkipToFill | 跳過動畫 |
| TogglePlayPause | 切換播放和暫停 |
<UserControl.Resources>
<Storyboard x:Key="StoryboardSample" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Duration="0:0:2.2" To="0.35"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
Storyboard.TargetName="StoryboardRectangle" d:IsOptimized="True"/>
<DoubleAnimation Duration="0:0:2.2" To="0.35"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
Storyboard.TargetName="StoryboardRectangle" d:IsOptimized="True"/>
</Storyboard>
</UserControl.Resources>
<Rectangle x:Name="StoryboardRectangle" />
<Button x:Name="button">
<Behaviors:Interaction.Triggers>
<Behaviors:EventTrigger EventName="Click">
<Behaviors:ControlStoryboardAction Storyboard="{StaticResource StoryboardSample}" ControlStoryboardOption="TogglePlayPause"/>
</Behaviors:EventTrigger>
</Behaviors:Interaction.Triggers>
</Button>
GoToStateAction
GoToStateAction表示在觸發時會將FrameworkElement(即Button)轉換為指定的VisualState的操作。此行為會將TargetObject或TargetName指定的元素更改為可視狀態StateName。除非UseTrantions設置為false,否則當前狀態和新狀態之間的任何轉換都將播放。
<Button x:Name="sampleStateButton">
<Button.Resources>
<Style TargetType="Button" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="BaseGrid">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Normal">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="Opacity" To="1.0" From="1.0"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="Opacity" To="0.25" From="1.0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Resources>
</Button>
<CheckBox x:Name="checkBox">
<Behaviors:Interaction.Triggers>
<Behaviors:DataTrigger Binding="{Binding IsChecked, ElementName=checkBox}" Value="False">
<Behaviors:GoToStateAction StateName="Normal" TargetObject="{Binding ElementName=sampleStateButton}"/>
</Behaviors:DataTrigger>
<Behaviors:DataTrigger Binding="{Binding IsChecked, ElementName=checkBox}" Value="True">
<Behaviors:GoToStateAction StateName="Disabled" TargetObject="{Binding ElementName=sampleStateButton}"/>
</Behaviors:DataTrigger>
</Behaviors:Interaction.Triggers>
</CheckBox>
Behavior
Behavior是一個行為,當事件發生時,會觸發Behavior中的行為
ConditionBehavior
條件行為,ConditionalExpression為條件表達式,當條件表達式為真時,觸發Behavior中的行為
<b:Interaction.Triggers>
<b:EventTrigger EventName="Click" SourceObject="{Binding ElementName=Button}">
<b:Interaction.Behaviors>
<b:ConditionBehavior>
<b:ConditionalExpression>
<b:ComparisonCondition LeftOperand="{Binding Path=Items.Count, ElementName=TabControl}" RightOperand="0" />
</b:ConditionalExpression>
</b:ConditionBehavior>
</b:Interaction.Behaviors>
<b:ChangePropertyAction/>
</b:EventTrigger>
</b:Interaction.Triggers>
DataStateBehavior
當行為綁定到的數據等于某個值時,DataStateBeact執行操作。每當更新關聯的綁定時,此行為都會檢查綁定結果是否等于某個值。如果兩個值相等,則轉換為TrueState。否則,它會轉換為FalseState。
<Button x:Name="sampleStateButton">
<Button.Resources>
<Style TargetType="Button" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="BaseGrid" Background="DeepPink">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Normal">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="DarkBlue" From="DeepPink" />
</Storyboard>
</VisualState>
<VisualState x:Name="Blue">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="DeepPink" From="DarkBlue" Duration="Forever" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Behaviors:Interaction.Behaviors>
<Behaviors:DataStateBehavior Binding="{Binding Text, ElementName=MyText}" Value="" TrueState="Normal" FalseState="Blue" />
</Behaviors:Interaction.Behaviors>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Resources>
</Button>
浙公網安備 33010602011771號