C# 由于绑定到在模板布局之前触发的事件而导致的名称范围问题
基于一些标准的web搜索,我将问题缩小到以下方面:我相信触发我的故事板的事件会在模板展开之前被调用。因此,名称是无意义的,故事板动画的名称引用是空的 如果我没有使用ControlTemplate,这不会是一个问题。我可以在布局更新后绑定到事件,然后在第一次手动调用它。问题解决了。然而,由于这是它自己的资源字典XAML文件中的一个ControlTemplate,所以我不能使用C来解决这个问题 (更新:我可以肯定地说,这不是一个排序问题——换句话说,它与在ControlTemplate.Resources或类似文件之前定义内容无关。但是,此类排序问题可能会导致类似的问题,因此,如果遇到类似的问题,这件事值得调查。请参阅answ之一以下是在本次更新之前制作的ers,以获取更详细的解释。) 再说一次,我可能完全走错了方向。这只是我对幕后发生的事情的理解。所以你可以自己判断,这里是实际的例外: 系统无效操作异常:C# 由于绑定到在模板布局之前触发的事件而导致的名称范围问题,c#,.net,wpf,controltemplate,eventtrigger,C#,.net,Wpf,Controltemplate,Eventtrigger,基于一些标准的web搜索,我将问题缩小到以下方面:我相信触发我的故事板的事件会在模板展开之前被调用。因此,名称是无意义的,故事板动画的名称引用是空的 如果我没有使用ControlTemplate,这不会是一个问题。我可以在布局更新后绑定到事件,然后在第一次手动调用它。问题解决了。然而,由于这是它自己的资源字典XAML文件中的一个ControlTemplate,所以我不能使用C来解决这个问题 (更新:我可以肯定地说,这不是一个排序问题——换句话说,它与在ControlTemplate.Resour
{在'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>