基于一些标准的网络搜索,我已经将我的问题缩小到了这一点:我相信在模板扩展之前调用触发我的故事板的事件。因此,名称毫无意义,故事板动画制作的名称引用为空。
如果我不使用ControlTemplate,这不会是一个问题。我可以在更新布局后绑定到事件,然后在第一次手动调用它。问题解决了。但是,由于这是自己的资源字典XAML文件中的ControlTemplate,我无法使用C#来解决此问题。
(更新:我可以肯定地说这不是一个排序问题 - 换句话说,它与在ControlTemplate.Resources或类似之前定义内容无关。但是,类似的问题可能是由这样的排序引起的如果你遇到类似的问题,这个问题值得研究。请参阅下面的一个答案,以获得更详细的解释。)
然后,我可能完全走错了路。这只是我对窗帘背后发生的事情的理解。所以你可以自己判断,这是实际的例外:
System.InvalidOperationException:
{“'PART_UnderlineBrush'名称在'System.Windows.Controls.ControlTemplate'的名称范围内找不到。”}
这是参考的样式/模板,删除了所有额外的东西(故事板,属性等)。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="MetroTabItem" TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Border>
<Border.BorderBrush>
<!-- This is the element that I need to reference, but I am unable to do so. -->
<SolidColorBrush Color="#00ffffff" x:Name="PART_UnderlineBrush" />
</Border.BorderBrush>
<ContentPresenter Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}" />
</Border>
<ControlTemplate.Resources>
<Storyboard x:Key="SelectTab">
<!-- This is the animation that will always fail, due to the name reference. -->
<ColorAnimation BeginTime="0:0:0"
Duration="0:0:0.5"
Storyboard.TargetProperty="Color"
Storyboard.TargetName="PART_UnderlineBrush"
To="#ddffffff" />
</Storyboard>
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Selector.Selected">
<BeginStoryboard Name="BeginSelected" Storyboard="{StaticResource SelectTab}" />
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
答案 0 :(得分:2)
我不知道这是否会完全符合您的要求,但如果您将EventTrigger
替换为Trigger
以获取TabItem的IsSelected属性,则可能会有效:
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Name="BeginSelected" Storyboard="{StaticResource SelectTab}" />
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
原始代码似乎确实存在一些时间问题。在加载控件之前,似乎会触发Selector.Selected事件。
答案 1 :(得分:1)
点亮你的
<ControlTemplate.Resources>
之前的
<Border>
完整代码:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="MetroTabItem" TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<ControlTemplate.Resources>
<Storyboard x:Key="SelectTab">
<!-- This is the animation that will always fail, due to the name reference. -->
<ColorAnimation BeginTime="0:0:0"
Duration="0:0:0.5"
Storyboard.TargetProperty="Color"
Storyboard.TargetName="PART_UnderlineBrush"
To="#ddffffff" />
</Storyboard>
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Selector.Selected">
<BeginStoryboard Name="BeginSelected" Storyboard="{StaticResource SelectTab}" />
</EventTrigger>
</ControlTemplate.Triggers>
<Border>
<Border.BorderBrush>
<!-- This is the element that I need to reference, but I am unable to do so. -->
<SolidColorBrush Color="#00ffffff" x:Name="PART_UnderlineBrush" />
</Border.BorderBrush>
<ContentPresenter Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>