【问题标题】:DataTrigger in ControlTemplate does not workControlTemplate 中的 DataTrigger 不起作用
【发布时间】:2012-04-17 21:50:45
【问题描述】:

我是新来的,希望我的第一个问题符合堆栈溢出的要求。到目前为止,我已经做了一些研究,但我自己无法弄清楚。
我创建了一个 UserControl(从中间基类派生),它应该能够根据其作为 DependencyProperty 的“VisualAlarmState”属性将颜色符号更改为不同的颜色。
Style plus ControlTemplate 按预期呈现,但样式末尾的 DataTrigger 不会更改作为 Image 元素的 VisualAlarmSign 的颜色 (=image)。
代码可以编译运行,没有错误,但是报警状态不会按预期显示。

我也不太明白的东西:我必须动态引用样式,因为 Style="{StaticResource DashboardItemStyle}" 将加下划线,并且在鼠标悬停时说:“资源“DashboardItemStyle”无法解析。”

<ucbase:DashboardItemBase.Resources>
            <BitmapImage x:Key="MO-Zylinderdeckel" UriSource="/ModuleDashboard;component/Resources/MO-Zylinderdeckel.tif" />
            <BitmapImage x:Key="MO-Zylindermantel" UriSource="/ModuleDashboard;component/Resources/MO-Zylindermantel.tif" />
            <BitmapImage x:Key="MO-Zylinderboden" UriSource="/ModuleDashboard;component/Resources/MO-Zylinderboden.tif" />
            <BitmapImage x:Key="MO-Marker-Grün" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Grün.tif" />
            <BitmapImage x:Key="MO-Marker-Orange" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Orange.tif" />
            <BitmapImage x:Key="MO-Marker-Rot" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Rot.tif" />

    <Style x:Key="DashboardItemStyle" TargetType="{x:Type ucbase:DashboardItemBase}">

        <Setter Property="Template" x:Name="Template1">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ucbase:DashboardItemBase}">                        
                    <dxlc:Tile x:Name="Tile" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1"
                            Height="128.5" Width="208.5" Background="{x:Null}">
                        <dxlc:Tile.Content>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="11.5" />
                                    <RowDefinition Height="*" />
                                    <RowDefinition Height="12.5" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="6.5" />
                                </Grid.ColumnDefinitions>

                                <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1"
                                        HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch"
                                        Source="{StaticResource MO-Zylinderdeckel}" />

                                <Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Grid.RowSpan="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="6.5" />
                                    </Grid.ColumnDefinitions>
                                    <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="2"
                                            HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch"
                                            Source="{StaticResource MO-Zylindermantel}" />


                                        <Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Height="14"
                                            Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right"
                                            VerticalAlignment="Top" Source="{StaticResource MO-Marker-Grün}" />
                                </Grid>

                                <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="3" Grid.RowSpan="1"
                                        HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch"
                                        Source="{StaticResource MO-Zylinderboden}" />
                            </Grid>
                        </dxlc:Tile.Content>
                    </dxlc:Tile>

                    <ControlTemplate.Triggers>

                        <!-- This Trigger has no effect. Why?-->
                        <DataTrigger
                                Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=VisualAlarmState}">
                            <DataTrigger.Value>
                                <vmbase:AlarmState>Alarm</vmbase:AlarmState>
                            </DataTrigger.Value>
                            <Setter TargetName="VisualAlarmSign" Property="Source"
                                    Value="{StaticResource MO-Marker-Rot}" />
                        </DataTrigger>                      </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ucbase:DashboardItemBase.Resources>

工作解决方案

我从&lt;Image&gt; 元素中删除了Source={StaticResource MO-Marker-Grün},并将&lt;DataTrigger&gt;&lt;ControlTemplate.Triggers&gt; 移到&lt;Image.Style&gt; 中的&lt;Style.Triggers&gt;,这导致了以下XAML 代码:

<ucbase:DashboardItemBase.Resources>
    ...
    <BitmapImage x:Key="MO-Marker-Rot" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Rot.tif" />
    ...
        <Style x:Key="DashboardItemStyle" TargetType="{x:Type ucbase:DashboardItemBase}">
            <Setter Property="Template" x:Name="Template1">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ucbase:DashboardItemBase}">                        
                        <dxlc:Tile x:Name="Tile" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1"
                                Height="128.5" Width="208.5" Background="{x:Null}">
                            <dxlc:Tile.Content>
                                <Grid>
                                    ...                                     
                                    <Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0"
                                            Height="14" Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right"
                                            VerticalAlignment="Top" >
                                        <Image.Style>
                                            <Style>
                                                <Style.Triggers>
                                                    <DataTrigger
                                                            Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=VisualAlarmState}"
                                                            Value="Alarm">
                                                        <Setter Property="Image.Source"
                                                                Value="{StaticResource MO-Marker-Rot}" />
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </Image.Style>
                                    </Image>
                                    ...
                                </Grid>
                            </dxlc:Tile.Content>                        
                        </dxlc:Tile>                        
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
</ucbase:DashboardItemBase.Resources>

【问题讨论】:

  • 代码看起来不错。检查您的输出工具窗口中是否有绑定错误。您是否尝试将警报状态绑定到普通文本块,以确保与 DP 的绑定正常工作?
  • 顺便说一下,如果AlarmState是枚举,你可以简单地在触发器中使用Value="Alarm"而不指定类型。
  • @Marat Khasanov:感谢您的建议
    @SvenG:VisualAlarmState 非常适合绑定到 Label.Content

标签: wpf templates styles datatemplate controltemplates


【解决方案1】:

尝试使用样式属性设置器设置图像的来源。一些触发器的行为方式。

<Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Height="14"
                                            Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right"
                                            VerticalAlignment="Top">
    <Image.Style>
    <Style>
     <Setter TargetName="VisualAlarmSign" Property="Source"
                                        Value="{StaticResource MO-Marker-Grün}" />
    </Style>
    </Image.Style>
</Image>

确保删除图像标签中的源属性。

某些触发器可能无法设置我们在标签中使用的属性。在您的情况下,您在图像标签中设置了 source 的值。如果您通过样式设置器设置相同的值,它可能会蠕虫。值得一试。

【讨论】:

  • 使用 Image.Style 不起作用,因为我收到编译时错误:“TargetName 属性无法在样式设置器上设置。”
  • 删除setter中的目标名称..我们不需要setter中的targetname,因为我们正在为同一个对象设置样式..您可能需要在该位置使用Property="Image.Source" of Property="来源"
  • 谢谢,现在异常消失了,但是触发器仍然没有效果。
  • 我将此答案标记为已接受,因为最终您的解决方案或多或少起作用:我将 DataTriggers 从 移动到 中的 。我得到的唯一缺点是我只在运行时而不是在设计时看到警报状态 - 任何建议为什么和解决这个问题的可能性? - 顺便说一句,我还必须删除图像标签中的源属性才能使其正常工作。
猜你喜欢
  • 2011-03-04
  • 2021-11-14
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2013-09-24
  • 2017-02-19
  • 2016-10-02
  • 2015-04-30
相关资源
最近更新 更多