C# 在一个影响另一个对象的对象上创建一个简单的wpf触发器
这是我最接近于在上面创建一个简单触发器的地方。我只希望datagrid的IsMouseOver==true显示该按钮。 问题是Setter的TargetName表示:属性“TargetName”不代表“Setter”的有效目标,因为找不到名为“ButtonExpand”的元素。确保目标在使用它的任何设置器、触发器或条件之前声明。 我做错了什么C# 在一个影响另一个对象的对象上创建一个简单的wpf触发器,c#,.net,wpf,wpf-4.0,.net-4.0,C#,.net,Wpf,Wpf 4.0,.net 4.0,这是我最接近于在上面创建一个简单触发器的地方。我只希望datagrid的IsMouseOver==true显示该按钮。 问题是Setter的TargetName表示:属性“TargetName”不代表“Setter”的有效目标,因为找不到名为“ButtonExpand”的元素。确保目标在使用它的任何设置器、触发器或条件之前声明。 我做错了什么 <UserControl.Resources> <Style TargetType="DataGrid">
<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>
+
TargetName不打算使用
在触发器集合中
一种风格。一个样式没有一个
名称范围,所以它没有意义
在此处按名称引用元素。
而是一个模板(DataTemplate或
ControlTemplate)有一个
名称镜
见链接
您可以通过另一种方式来完成,使用按钮的DataTrigger。请注意,必须在样式内设置特性可见性,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>
另一种方法是使用转换器将ButtonExand的Visibility绑定到DataGrid的IsMouseOver属性。
<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>
鼠标悬停在按钮上时会闪烁。这基本上是正确的。我不能给你的答案道具,因为我没有15级或其他级别。我在下面发布了我的答案,但我在两天内无法点击它作为答案。非常感谢你。你当然应该得到这个答案,但我不想用同样的问题把任何人搞砸。@Bluebaron:我把你的两个修改编辑成了Meleak的答案,所以现在你可以删除你的答案并把他的标记为正确。这两个更改被折叠->隐藏,maindatgrid->MainGrid,并添加周围的代码来显示MainGrid的定义位置。对,我不知道我在想什么:)编辑得好!很高兴它与更改一起工作BluebaronI将您的两个更改编辑为Meleak的答案,所以现在您可以删除此答案并将Meleak的答案标记为正确。