触发器语法的WPF问题

时间:2009-10-27 01:47:51

标签: wpf xaml triggers

我无法让以下工作。目标是更改usercontrol的ZIndex 当鼠标超过其内容时。

使用像“Background”这样的简单属性而不是ZIndex也不起作用。编译器抱怨“Value'Grid.IsMouseOver'无法分配给属性'Property'。对象引用未设置为对象的实例。” (编译并启动项目后)。

有人可以提供一个触发器的工作示例,它会更改不同控件的某些属性吗?

<UserControl x:Class="ImageToolWPF.Controls.sample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">

    <UserControl.Triggers>
        <Trigger SourceName="viewPort" Property="Grid.IsMouseOver" Value="True">
            <Setter TargetName="me" Property="UserControl.Panel.ZIndex" Value="2" />
        </Trigger>
    </UserControl.Triggers>

    <Border Name="border" CornerRadius="3,3,3,3" BorderThickness="3" BorderBrush="Green">
        <Grid Name="viewPort">
            <Label Name="labelTop" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="16" Background="#a0ffffff" Padding="4"/>
        </Grid>
    </Border>
</UserControl>

1 个答案:

答案 0 :(得分:1)

这里有很多问题:

  • FrameworkElement.Triggers只能包含EventTriggers,而不能包含常规触发器。 (请参阅MSDN文档中的备注。)您将需要将触发器移动到样式中。
  • 在您的Setter中,您已指定TargetName为“me”,但似乎没有任何具有该名称的元素。我认为你的意思是让setter影响UserControl本身。在这种情况下,如果将Trigger移动到UserControl上的Style中,则可以完全省略TargetName:样式中的setter会自动影响样式元素。
  • 在您的Setter中,您已指定UserControl.Panel的属性。这意味着你期望目标(称为“我”的东西)拥有一个名为UserControl的属性,并且拥有一个名为Panel的属性。我认为你要找的是“(Panel.ZIndex)” - 注意括号显示这是一个附加的属性名而不是多部分路径,并且没有UserControl前缀。