【问题标题】:WPF DataTrigger not firing when Application style applied?应用应用程序样式时 WPF DataTrigger 不触发?
【发布时间】:2010-01-26 15:46:27
【问题描述】:

对于这个问题的任何帮助将不胜感激,因为我整天都在四处寻找有关该领域的答案!

通过将合并字典添加到 App.xaml,我已将全局样式应用于我的 WPF 应用程序。这已按预期将样式应用于整个应用程序,但它所做的许多事情我并不完全理解。

如果有帮助的话,我可以给你应用该样式的代码,但它非常大,所以最好不要阻塞这篇文章。该样式将背景颜色应用于每个列表框项,以及将鼠标悬停在动画和颜色变化上。但是,这种样式并未应用于我的应用程序中的几个列表框,下面的代码示例:

<StackPanel Margin="0,15,0,0" Width="auto" HorizontalAlignment="Left">
    <StackPanel.Resources>
        <converter:IntToBoolConverter x:Key="intToBoolConverter" />
        <converter:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />
    </StackPanel.Resources>
    <Label Content="Required Vehicles" HorizontalAlignment="Center" FontWeight="Bold" />
    <ListBox x:Name="lstVehicleRequests" ItemsSource="{Binding VehicleRequests}" Width="auto"
             IsSynchronizedWithCurrentItem="True">
        <ListBox.Resources>
            <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource BaseListBoxItem}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=RequestStatus.RequestStatusId}" Value="7">
                        <Setter Property="Background">
                            <Setter.Value>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#FFFFFFFB" Offset="0" />
                                    <GradientStop Color="IndianRed" Offset="0.5" />
                                    <GradientStop Color="#FFFFFFFB" Offset="1" />
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid ShowGridLines="True">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto" />
                        <ColumnDefinition Width="auto" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto" />
                        <RowDefinition Height="4" />
                    </Grid.RowDefinitions>
                    <StackPanel Margin="0,8,0,0">
                        <TextBlock Margin="0,4,10,0" >
                        <Label Content="Coach Type" Width="120" />
                        <ComboBox ItemsSource="{Binding DataContext.CoachTypes, 
                                  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                  SelectedItem="{Binding CoachType}" DisplayMemberPath="Name" Width="100" />
                        </TextBlock>
                        <TextBlock Margin="0,8,10,0">
                            <Label Content="No of Passengers" Width="120" />
                            <TextBox 
                                    keys:ValidKeys.Numeric="True"
                                    Validation.ErrorTemplate="{StaticResource validationTemplate}"
                                    Style="{StaticResource textBoxInError}" Width="50">
                                <TextBox.Text>
                                        <Binding Path="Passengers"
                                                  UpdateSourceTrigger="PropertyChanged">
                                            <Binding.ValidationRules>
                                                <val:RegularExpressionRule 
                                                    ErrorDescription="Please Enter a Numeric Size" 
                                                    RegularExpression="^\d*$" />
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                            </TextBox>
                        </TextBlock>
                        <TextBlock Margin="0,8,10,0">
                            <Label Content="No of Drivers" Width="120" />
                            <TextBox
                                    keys:ValidKeys.Numeric="True"
                                    Validation.ErrorTemplate="{StaticResource validationTemplate}"
                                    Style="{StaticResource textBoxInError}" Width="50">
                                <TextBox.Text>
                                    <Binding Path="Drivers"
                                        UpdateSourceTrigger="PropertyChanged">
                                        <Binding.ValidationRules>
                                            <val:RegularExpressionRule 
                                                ErrorDescription="Please Enter a Numeric Size" 
                                                RegularExpression="^\d*$" />
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                            </TextBox>
                        </TextBlock>
                        <TextBlock Margin="0,8,10,0">
                        <Label Content="Positioning Feeder Drivers" Width="120" />
                            <TextBox
                                    keys:ValidKeys.Numeric="True"
                                    Style="{StaticResource textBoxInError}" Width="50" MaxLength="3">
                                <TextBox.Text>
                                    <Binding Path="PositioningFeederDrivers"
                                        UpdateSourceTrigger="PropertyChanged">
                                        <Binding.ValidationRules>
                                            <val:RegularExpressionRule 
                                                ErrorDescription="Please Enter a Numeric Size" 
                                                RegularExpression="^\d*$" />
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                            </TextBox>
                        </TextBlock>
                        <TextBlock Margin="0,8,10,0">                    
                        <Label Content="Wheelchair Access" Width="120" />
                        <ComboBox Width="100" SelectedIndex="{Binding WheelchairAccess, 
                                  Converter={StaticResource intToBoolConverter}}">
                            <ComboBoxItem Content="Not Required" />
                            <ComboBoxItem Content="Required" />
                        </ComboBox>
                        </TextBlock>
                        <TextBlock Margin="0,8,10,8">
                        <Label Content="Trailer" Width="120" />
                        <ComboBox Width="100" SelectedIndex="{Binding Trailer, 
                                  Converter={StaticResource intToBoolConverter}}">
                            <ComboBoxItem Content="Not Required" />
                            <ComboBoxItem Content="Required" />
                        </ComboBox>
                        </TextBlock>
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

然后我添加了如上所示的 BasedOn 属性,为什么我必须这样做才能将样式应用于此列表框?其他列表框和不同的控件自动选择了这个?

无论如何,您会看到我有一个针对此列表框的数据触发器,当请求状态 id = 7 时,它应该更改背景颜色。没有 based on 属性,该行成功将颜色更改为红色。应用样式时,它永远不会改变颜色,并且始终应用模板中的橙色。

求助??????

非常感谢,

标记

【问题讨论】:

  • 如果在没有 BasedOn 属性的情况下颜色变为红色,那么您的样式正在正确地应用于您的 ListBox,否则它不会改变。模板中的橙色在哪里?您使用的哪些不同类型的控件在此样式定义中表现出不同的行为?
  • 橙色从作为合并字典从 App.Xaml 导入的 baseListBox 样式应用于此列表框。我们在整个应用程序中使用了大多数控件、列表框、组合框、标签、文本框等...所有这些都从 App.xaml 中获取了样式,而无需添加 BasedOn 属性。我认为这可能与我们正在更改列表框的数据模板有关?主要问题是,在包含 BasedOn 属性的情况下,为什么背景不会随着数据触发器而改变?我已将基本样式包含在下面谢谢!

标签: wpf xaml styling datatrigger


【解决方案1】:
<Style x:Key="BaseListBoxItem" d:IsControlPart="True" TargetType="{x:Type ListBoxItem}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Padding" Value="3" />
        <Setter Property="Foreground" Value="{StaticResource OutsideFontColor}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="HoverOn">
                            <DoubleAnimation Duration="00:00:00.1000000" Storyboard.TargetName="BackgroundGradientOver" 
                                             Storyboard.TargetProperty="Opacity" To="0.73" />
                        </Storyboard>
                        <Storyboard x:Key="HoverOff">
                            <DoubleAnimation Duration="00:00:00.4000000" Storyboard.TargetName="BackgroundGradientOver" 
                                             Storyboard.TargetProperty="Opacity" To="0" />
                        </Storyboard>
                        <Storyboard x:Key="SelectedOn">
                            <DoubleAnimation Duration="00:00:00.1000000" Storyboard.TargetName="BackgroundGradientSelected" 
                                             Storyboard.TargetProperty="Opacity" To="0.84" />
                            <DoubleAnimation Duration="00:00:00.1000000" Storyboard.TargetName="BackgroundGradientSelectedDisabled" 
                                             Storyboard.TargetProperty="Opacity" To="0.55" />
                        </Storyboard>
                        <Storyboard x:Key="SelectedOff">
                            <DoubleAnimation Duration="00:00:00.4000000" Storyboard.TargetName="BackgroundGradientSelected" 
                                             Storyboard.TargetProperty="Opacity" To="0" />
                            <DoubleAnimation Duration="00:00:00.4000000" Storyboard.TargetName="BackgroundGradientSelectedDisabled" 
                                             Storyboard.TargetProperty="Opacity" To="0" />
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Grid SnapsToDevicePixels="true">
                        <Rectangle x:Name="BackgroundGradientOver" RadiusX="1" RadiusY="1" Stroke="{DynamicResource MouseOverBorderBrush}" 
                                   Opacity="0" Fill="{DynamicResource MouseOverBrush}"/>
                        <Rectangle x:Name="BackgroundGradientSelectedDisabled" RadiusX="1" RadiusY="1" Opacity="0" Fill="{DynamicResource 
                            ListItemSelectedBrush}" Stroke="{DynamicResource ListItemSelectedBorderBrush}"/>
                        <Rectangle x:Name="BackgroundGradientSelected" Stroke="{DynamicResource PressedBorderBrush}" StrokeThickness="1" 
                                   RadiusX="1" RadiusY="1" Opacity="0" Fill="{DynamicResource PressedBrush}">

                        </Rectangle>
                        <ContentPresenter x:Name="contentPresenter" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
                                          ContentTemplate="{TemplateBinding ContentTemplate}" 
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"  />
                    </Grid>
                    <ControlTemplate.Triggers>

                        <Trigger Property="IsSelected" Value="true">
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource SelectedOff}" x:Name="SelectedOff_BeginStoryboard" />
                            </Trigger.ExitActions>
                            <Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource SelectedOn}" x:Name="SelectedOn_BeginStoryboard" />
                            </Trigger.EnterActions>

                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource HoverOff}" x:Name="HoverOff_BeginStoryboard" />
                            </Trigger.ExitActions>
                            <Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource HoverOn}" />
                            </Trigger.EnterActions>
                        </Trigger>

                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2010-10-15
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多