Странное исключение NullReferenceException при использовании триггеров - PullRequest
1 голос
/ 31 марта 2011

У меня есть очень простой шаблон TabItem и один MultiTrigger с атрибутом SourceName, используемым для одного Condition.Следующий XAML выдает NullReferenceException при запуске без полезной информации, которая помогла бы мне решить проблему.

Самое странное в этом то, что код прекрасно работает, если вы удалите атрибут SourceName.Или, если вы оставите атрибут SourceName, но удалите MultiTrigger.EnterActions и будете использовать вместо него стандартные Setter s, то он также будет работать.Только комбинация атрибута SourceName и MultiTrigger.EnterActions создает NullReferenceException без видимой причины.Так что с этим не так?

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen">

    <Window.Resources>
        <Style TargetType="TabItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TabItem">
                        <ControlTemplate.Resources>
                            <Storyboard x:Key="Storyboard_TabItem_Hover">
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetName="background" Storyboard.TargetProperty="Opacity">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00.3" Value="0.1" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </ControlTemplate.Resources>

                        <Border x:Name="background" BorderBrush="Red" BorderThickness="1" Background="Yellow">
                            <Label Grid.Column="1" Content="{TemplateBinding Header}" />
                        </Border>

                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" SourceName="background" />
                                    <Condition Property="IsSelected" Value="False" />
                                </MultiTrigger.Conditions>

                                <MultiTrigger.EnterActions>
                                    <BeginStoryboard x:Name="sbHover" Storyboard="{StaticResource Storyboard_TabItem_Hover}"/>
                                </MultiTrigger.EnterActions>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <TabControl Margin="10">
        <TabItem Header="Tab 1" />
        <TabItem Header="Tab 2" />
        <TabItem Header="Tab 3" />
        <TabItem Header="Tab 4" />
    </TabControl>
</Window>

Обновление

Как Грег Сансом указал , существует простой обходной путь с использованием MultiDataTrigger иBinding.Тем не менее, я все еще хотел бы знать, почему исключение бросается в первую очередь.Я искал Google и MSDN как сумасшедший, но ничего не нашел.Так в чем же проблема?

1 Ответ

2 голосов
/ 31 марта 2011

Вы можете обойти эту проблему, изменив MultiTrigger на MultiDataTrigger и указав Binding вместо SourceName:

   <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding ElementName=bg,Path=IsMouseOver}" 
Value="True"  />
        <Condition Binding="{Binding RelativeSource={RelativeSource Self},
 Path=IsSelected}" Value="False" />
    </MultiDataTrigger.Conditions>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...