C# 由于绑定到在模板布局之前触发的事件而导致的名称范围问题

C# 由于绑定到在模板布局之前触发的事件而导致的名称范围问题,c#,.net,wpf,controltemplate,eventtrigger,C#,.net,Wpf,Controltemplate,Eventtrigger,基于一些标准的web搜索,我将问题缩小到以下方面:我相信触发我的故事板的事件会在模板展开之前被调用。因此,名称是无意义的,故事板动画的名称引用是空的 如果我没有使用ControlTemplate,这不会是一个问题。我可以在布局更新后绑定到事件,然后在第一次手动调用它。问题解决了。然而,由于这是它自己的资源字典XAML文件中的一个ControlTemplate,所以我不能使用C来解决这个问题 (更新:我可以肯定地说,这不是一个排序问题——换句话说,它与在ControlTemplate.Resour

基于一些标准的web搜索,我将问题缩小到以下方面:我相信触发我的故事板的事件会在模板展开之前被调用。因此,名称是无意义的,故事板动画的名称引用是空的

如果我没有使用ControlTemplate,这不会是一个问题。我可以在布局更新后绑定到事件,然后在第一次手动调用它。问题解决了。然而,由于这是它自己的资源字典XAML文件中的一个ControlTemplate,所以我不能使用C来解决这个问题

(更新:我可以肯定地说,这不是一个排序问题——换句话说,它与在ControlTemplate.Resources或类似文件之前定义内容无关。但是,此类排序问题可能会导致类似的问题,因此,如果遇到类似的问题,这件事值得调查。请参阅answ之一以下是在本次更新之前制作的ers,以获取更详细的解释。)

再说一次,我可能完全走错了方向。这只是我对幕后发生的事情的理解。所以你可以自己判断,这里是实际的例外:

系统无效操作异常:
{在'System.Windows.Controls.ControlTemplate'的名称范围内找不到'PART_UnderlineBrush'名称。}

这里是样式/模板供参考,删除了所有额外的内容(故事板、属性等)


把你的

<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>


我不知道这是否能完全满足您的要求,但是如果您将选项卡项的IsSelected属性的
事件触发器
替换为
触发器
,它可能会工作:

<ControlTemplate.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Trigger.EnterActions>
            <BeginStoryboard Name="BeginSelected" Storyboard="{StaticResource SelectTab}" />
        </Trigger.EnterActions>
    </Trigger>
</ControlTemplate.Triggers>


原始代码似乎存在一些计时问题。选择器。所选事件似乎是在加载控件之前触发的。

感谢您的尝试,但这没有什么区别。我将故事板放在内容之后,因为故事板引用内容中定义的名称,且定义顺序为t不幸的是,在XAML中结束很重要。然而,值得一提的是,这种排序问题可能是WPF开发人员的常见问题,如果遇到类似的问题,也值得研究。谢谢,我会试一试。我不知道你可以用简单的触发元素启动故事板。仍然有点混乱,但我认为他们最终可能会工作!不幸的是,我仍然无法让更复杂的动画按我的预期工作,但这个答案确实解决了原来的问题。谢谢!
<ControlTemplate.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Trigger.EnterActions>
            <BeginStoryboard Name="BeginSelected" Storyboard="{StaticResource SelectTab}" />
        </Trigger.EnterActions>
    </Trigger>
</ControlTemplate.Triggers>