Проблемы с областью имен из-за привязки к событию, которое запускается до макета шаблона - PullRequest
4 голосов
/ 04 февраля 2012

Основываясь на каком-то стандартном веб-поиске, я сузил свою проблему до следующего: я считаю, что событие, которое запускает мою раскадровку, вызывается до расширения шаблона.Таким образом, имена не имеют смысла, а ссылки на имена, сделанные анимацией раскадровки, являются нулевыми.

Это не было бы проблемой, если бы я не работал с ControlTemplate.Я мог бы просто привязать событие после обновления макета, а затем вручную вызвать его в первый раз.Задача решена.Тем не менее, поскольку это ControlTemplate в собственном XAML-файле словаря ресурсов, я не могу использовать 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>

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Я не знаю, будет ли это делать именно то, что вы хотите, но если вы замените EventTrigger на Trigger для свойства IsSelected объекта TabItem, оно может работать:

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

Похоже, что с исходным кодом происходит проблема синхронизации.Похоже, что событие Selector.Selected наступило до загрузки элемента управления.

1 голос
/ 04 февраля 2012

Поставьте

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...