为什么TabControl - DataTrigger - Storyboard的组合不起作用?

时间:2015-06-16 14:40:24

标签: wpf storyboard tabcontrol datatrigger

我的程序中遇到了某种绑定错误,我自己无法解释。

我想设置TextBox样式,以便在某些产品规范未涵盖该值时显示警告图标。当用户将光标悬停在图标上时,AdornerLayer中会显示更详细的警告消息。

Screenshot of the application

正如您所看到的,该控件有效,但我仍然有一个问题。为了描述我的问题,我将代码减少到绝对最小值:

我的代码

的App.xaml

<Application x:Class="WpfApplication3.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:ThemesAero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
         StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="22" />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <ThemesAero:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="True">
                                <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </ThemesAero:ListBoxChrome>
                            <Image Name="WarningIcon" Margin="5,0,0,0" Grid.Column="1" RenderOptions.BitmapScalingMode="HighQuality" Source="warning_256x256.png" />
                            <Border x:Name="InformationBorder" Background="#E1BA18" Margin="5,0,0,0" Grid.Row="1" Grid.ColumnSpan="2" Opacity="0" CornerRadius="1.5" IsHitTestVisible="False" MinHeight="24" MaxWidth="267" VerticalAlignment="Bottom" HorizontalAlignment="Left">
                                <TextBlock Text="This is some warning message." Foreground="White" Margin="8,3,8,3" TextWrapping="Wrap"/>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <DataTrigger Binding="{Binding ElementName=WarningIcon, Path=IsMouseOver}" Value="True">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard x:Name="fadeInStoryboard">
                                        <Storyboard>
                                            <DoubleAnimation Duration="00:00:00.15" Storyboard.TargetName="InformationBorder" Storyboard.TargetProperty="Opacity" To="1"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                                <DataTrigger.ExitActions>
                                    <StopStoryboard BeginStoryboardName="fadeInStoryboard"/>
                                    <BeginStoryboard x:Name="fadeOutStoryBoard">
                                        <Storyboard>
                                            <DoubleAnimation Duration="00:00:00.15" Storyboard.TargetName="InformationBorder" Storyboard.TargetProperty="Opacity" To="0"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.ExitActions>
                            </DataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>
</Application>

MainWindow.xaml

<Window x:Class="WpfApplication3.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">
    <Grid>
        <TabControl>
            <TabItem Header="Debug 1">
                <TextBox Height="80" Width="150" />
            </TabItem>
            <TabItem Header="Debug 2">
                <TextBox Height="80" Width="150" />
            </TabItem>
        </TabControl>
    </Grid>
</Window>

我的问题究竟是什么?

我们在这里有什么?我已将Style应用于TextBox中的两个TabControl

在第一个TabItem(调试1)上,IsMouseOver触发器工作正常,并将警告消息淡入和淡出。

但是,第二个TextBox(调试2)上的相同TabItem会引发以下错误,并且IsMouseOver触发器根本不起作用。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=WarningIcon'. BindingExpression:Path=IsMouseOver; DataItem=null; target element is 'TextBox' (Name=''); target property is 'NoTarget' (type 'Object')

我试图解决这个问题是什么?

当我阅读一些有关如何解决此问题的建议解决方案时,我终于注意到以下触发器的全部 正常工作

<DataTrigger Binding="{Binding ElementName=WarningIcon, Path=IsMouseOver}" Value="True">
    <Setter TargetName="InformationBorder" Property="Opacity" Value="1" />
</DataTrigger>

-

<Trigger SourceName="WarningIcon" Property="IsMouseOver" Value="True">
    <Trigger.EnterActions>
        <BeginStoryboard x:Name="fadeInStoryboard">
            <Storyboard>
                <DoubleAnimation Duration="00:00:00.15" Storyboard.TargetName="InformationBorder" Storyboard.TargetProperty="Opacity" To="1"/>
            </Storyboard>
        </BeginStoryboard>
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <StopStoryboard BeginStoryboardName="fadeInStoryboard"/>
        <BeginStoryboard x:Name="fadeOutStoryBoard">
            <Storyboard>
                <DoubleAnimation Duration="00:00:00.15" Storyboard.TargetName="InformationBorder" Storyboard.TargetProperty="Opacity" To="0"/>
            </Storyboard>
        </BeginStoryboard>
    </Trigger.ExitActions>
</Trigger>

-

<Trigger SourceName="WarningIcon" Property="IsMouseOver" Value="True">
    <Setter TargetName="InformationBorder" Property="Opacity" Value="1" />
</Trigger>

当我在DataTrigger中使用StoryboardTabControl private void metroButton3_Click(object sender, EventArgs e) { if (counter <= 9) { dgdImages.Rows[0].Cells[counter].Value = pictureBox1.Image; dgdImages.Rows[0].Cells[oddcounter].Value = txtImgName.Text; counter++; counter++; oddcounter++; oddcounter++; } else { MessageBox.Show("System currently only supports five images per Contaimination area"); } } 时,才会出现此错误,但为什么? 我已经知道如何来解决这个问题,所以我只是对在幕后发生的感兴趣。

0 个答案:

没有答案