我有一个ControlTemplate
用于9个按钮(在这种情况下是一个tic tac toe字段)
目的是在游戏结束后有一个额外的动画变为Button
红色。模板在App.xaml中定义,并在Spiel.xaml.cs中使用。使用此模板的按钮是在代码中创建的,而不是使用Spiel.xaml文件。
<Application.Resources>
<ControlTemplate x:Key="MatrixElement" TargetType="Button">
<Border x:Name="MatrixElementBorder" BorderBrush="White" Margin="0,0,0,0" Width="140" Height="140">
<Border.Background>
<SolidColorBrush x:Name="MatrixElementBackgroundBrush" Color="LightBlue"/>
</Border.Background>
<Border.Resources>
<Storyboard x:Key="storyBoardOnWin">
<ColorAnimation
Storyboard.TargetName="MatrixElementBorder"
Storyboard.TargetProperty="(Border.Background)"
From="DarkBlue"
To="DarkRed"
Duration="0:0:2" />
</Storyboard>
</Border.Resources>
</Border>
</ControlTemplate>
...
</Application.Resources>
我找不到在我的代码中访问storyBoardOnWin动画的方法。
我尝试通过Application.Current.Resources["storyBoardOnWin"];
来访问它
但是返回一个nullPointer。如何在后面的代码中访问模板的资源?
答案 0 :(得分:0)
您的问题的解决方案是您已将storyBoardOnWin属性标记为Border的资源字典中的Key。如果您将其标记为名称,则可以在代码隐藏中直接调用它。
换句话说,你有这个:
<Storyboard x:Key="storyBoardOnWin">
您可以这样做:
<Storyboard x:Name="storyBoardOnWin">
并从后面的代码中调用它:
page.xaml.cs
...
storyBoardOnWin.Begin();
...
希望有所帮助!我不确定你是如何使用ControlTemplate的,即如果它在自己的文件中被定义为资源,那么如果是,那么这可能不会起作用。
答案 1 :(得分:0)
您无法访问该资源,因为它不是App.Resources的资源。它是控件的资源,是App.Resouces的资源。
我猜你在尝试获取动画时已经有了按钮(可能是通过按钮点击事件或其他东西),所以请尝试以下方法:
var border = (Border)VisualTreeHelper.GetChild(button,0);
var story = (Storyboard)border.Resources["storyBoardOnWin"];