【问题标题】:Create a simple wpf trigger on one object that affects another在一个影响另一个对象上创建一个简单的 wpf 触发器
【发布时间】:2010-11-17 20:13:19
【问题描述】:

这是我最接近创建一个简单触发器的方法。我只希望数据网格的 IsMouseOver == true 显示按钮。 问题是 Setter 的 TargetName 说:属性“TargetName”不代表“Setter”的有效目标,因为找不到名为“ButtonExpand”的元素。确保在使用它的任何设置器、触发器或条件之前声明目标。 我做错了什么?

<UserControl.Resources>
    <Style TargetType="DataGrid">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="ButtonExpand" Property="Visibility" Value="Visible" />
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Grid>



    <DataGrid Name="MainDataGrid" ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Version" Binding="{Binding Version}"/>
            <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/>
        </DataGrid.Columns>
    </DataGrid>

    <Button Name="ButtonExpand" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Visibility="Hidden">+</Button>
</Grid>

【问题讨论】:

    标签: c# .net wpf wpf-4.0 .net-4.0


    【解决方案1】:

    TargetName 不适合使用 在 Triggers 集合中 一种风格。样式没有 名称范围,所以它没有意义 在那里按名称引用元素。 但是模板(DataTemplate 或 ControlTemplate) 确实有一个 名称范围。

    请参阅this 链接。

    您可以使用按钮的 DataTrigger 以相反的方式执行此操作。请注意,您必须在 Style 中设置 Property Visibility 才能使 DataTrigger 正常工作。

    <Grid Name="MainGrid"> 
    
        <DataGrid ItemsSource="{Binding Programs}"
                  IsReadOnly="True"
                  AutoGenerateColumns="false" > 
          <DataGrid.Columns> 
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
            <DataGridTextColumn Header="Version" Binding="{Binding Version}"/> 
            <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/> 
          </DataGrid.Columns> 
        </DataGrid> 
    
        <Button Name="ButtonExpand"
                Height="25"
                Width="25"
                HorizontalAlignment="Right"
                VerticalAlignment="Bottom"
                Content="+">
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Visibility" Value="Hidden"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=MainGrid,
                                                       Path=IsMouseOver}" 
                                     Value="True">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </Grid>
    

    另一种方法是使用转换器将 ButtonExpand 的 Visibilty 绑定到 DataGrid 的 IsMouseOver 属性。

    【讨论】:

    • 当鼠标悬停在按钮上时它会闪烁。
    • 这基本上是对的。我不能给你答案道具,因为我没有15级什么的。我在下面发布了我的答案,但两天内我无法单击它作为答案。非常感谢。你绝对应该得到这个答案,但我不想用同样的问题把任何人搞砸。
    • @Bluebaron:我将您的两个更改编辑为 Meleak 的答案,所以现在您可以删除您的答案并将他的答案标记为正确。两个更改是 Collapsed -> Hidden、MainDataGrid -> MainGrid,以及添加周围代码以显示 MainGrid 的定义位置。
    • 对,我不知道我在想什么 :) 很好的编辑 Ray!很高兴它与 Bluebaron 的变化一起工作
    【解决方案2】:
    <Grid Name="MainGrid">
    
        <DataGrid ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Version" Binding="{Binding Version}"/>
                <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/>
            </DataGrid.Columns>
        </DataGrid>
    
        <Button Name="ButtonExpand" Margin="0,0,20,20" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="+">
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Visibility" Value="Hidden"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=MainGrid,
                                               Path=IsMouseOver}" 
                             Value="True">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    
    </Grid>
    

    【讨论】:

    • 我将您的两个更改编辑为 Meleak 的答案,所以现在您可以删除此答案并将 Meleak 的答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2011-11-15
    • 2013-05-10
    相关资源
    最近更新 更多