对某些故事板使用事件触发器。
还需要将不透明度分配给没有故事板的TextBlock。
如何直接分配基于触发器的值?EventTrigger赋值属性(无故事板)
<Expander.Triggers>
<EventTrigger RoutedEvent="Expander.Expanded">
试图在扩展事件这样做,但没有奏效。
对某些故事板使用事件触发器。
还需要将不透明度分配给没有故事板的TextBlock。
如何直接分配基于触发器的值?EventTrigger赋值属性(无故事板)
<Expander.Triggers>
<EventTrigger RoutedEvent="Expander.Expanded">
试图在扩展事件这样做,但没有奏效。
这是一个DataTemplate
的小例子。有一个Grid
其中有Expander
与两个TextBlocks
。一个在扩展器InnerTextBlock
内,另一个不在 - OuterTextBlock
。当属性IsExpanded
== True
我们用DataTriggers
做具体操作。
XAML
<Window.Resources>
<DataTemplate DataType="{x:Type local:MyExpanderData}">
<Grid x:Name="MainGrid">
<Expander Name="MyExpander" Header="{Binding HeaderName}" IsExpanded="{Binding isExpanded}">
<TextBlock Name="InnerTextBlock" Text="InnerTextBlock" Width="150" Height="30" VerticalAlignment="Top" FontSize="16" />
</Expander>
<TextBlock Name="OuterTextBlock" Text="OuterTextBlock" Width="150" Height="30" Margin="0,30,0,0" FontSize="16" />
</Grid>
<!-- Our DataTriggers -->
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="True">
<Setter TargetName="OuterTextBlock" Property="Opacity" Value="0.5" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="True">
<Setter TargetName="InnerTextBlock" Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="True">
<Setter TargetName="MyExpander" Property="Header" Value="Expander open" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<!-- Resource data for the Expander -->
<local:MyExpanderData x:Key="MyExpanderData" HeaderName="Test Expander" isExpanded="True" />
</Window.Resources>
<Grid>
<!-- Our DataTemplate in ContentControl -->
<ContentControl Name="MyContentControl" Content="{StaticResource MyExpanderData}" />
</Grid>
Code behind
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class MyExpanderData
{
private bool expanded = false;
private string headerName = "";
public bool isExpanded
{
get
{
return expanded;
}
set
{
expanded = value;
}
}
public string HeaderName
{
get
{
return headerName;
}
set
{
headerName = value;
}
}
}
在类MyExpanderData
存储的数据,然后将它们在我们DataTemplate
Binding
。所有属性都存储在DataTemplate
中,我们可以通过这个类来设置。
不是很漂亮,但我所做的是在Collapsed中使用故事板来设置值。 – Paparazzi
[使用EventTrigger设置属性]的可能的重复(http://stackoverflow.com/questions/942548/setting-a-property-with-an-eventtrigger) –
该答案表示使用附加行为。我不明白如何用AttachedBehavior来做到这一点。我没有Expression Blend。 – Paparazzi
附加行为不需要混合。他们是混合sdk的一部分(并且因为混合与VS 2012一起发货,所以它也随之发货)。而且,混合行为是通过依赖属性对附加行为的形式化。这里是一个很好的差异的基础:http://briannoyes.net/2012/12/20/AttachedBehaviorsVsAttachedPropertiesVsBlendBehaviors.aspx –