WPF:当鼠标移到父元素上时,我可以设置ChildElement的IsMouseOver属性吗?
假设我在WPF:当鼠标移到父元素上时,我可以设置ChildElement的IsMouseOver属性吗?,wpf,templates,listbox,styles,Wpf,Templates,Listbox,Styles,假设我在ListBoxItem的模板中嵌套了一个按钮,我是否可以将按钮的IsMouseOver属性设置为true,使其看起来像鼠标移过的按钮 只是为了举例说明,窗口顶部的通知就是我所指的。基本上,它的ListBoxItem带有TextBlock和按钮 不幸的是,“IsMouseOver”不是只读的 不过,我假设您有一个按钮的自定义控件模板,对吗?如果是这样的话,一个解决办法就是弄乱按钮的Tag属性。向ControlTemplate添加一个触发器,该触发器在设置特定标记值时触发。然后,在ListB
ListBoxItem
的模板中嵌套了一个按钮,我是否可以将按钮的IsMouseOver
属性设置为true,使其看起来像鼠标移过的按钮
只是为了举例说明,窗口顶部的通知就是我所指的。基本上,它的ListBoxItem
带有TextBlock
和按钮
不幸的是,“IsMouseOver”不是只读的
不过,我假设您有一个按钮的自定义控件模板,对吗?如果是这样的话,一个解决办法就是弄乱按钮的Tag属性。向ControlTemplate添加一个触发器,该触发器在设置特定标记值时触发。然后,在ListBoxItems的DataTemplate中,当IsMouseOver在项目上为true时,只需将按钮的标记设置为该特定值。以下是一个例子:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel x:Name="dp" Background="Transparent">
<Button x:Name="btn" DockPanel.Dock="Right" Content="x" Background="Gainsboro">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="bd" Padding="2" BorderBrush="Black" BorderThickness="1"
Background="WhiteSmoke">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="bd" Property="Background" Value="LightBlue"/>
</Trigger>
<Trigger Property="Tag" Value="SimulatedMouseOver">
<Setter TargetName="bd" Property="Background" Value="LightBlue"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="bd" Property="Background" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
<TextBlock Text="{Binding}"/>
</DockPanel>
<DataTemplate.Triggers>
<Trigger SourceName="dp" Property="IsMouseOver" Value="True">
<Setter TargetName="btn" Property="Tag" Value="SimulatedMouseOver"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
<s:String>Item1</s:String>
<s:String>Item2</s:String>
<s:String>Item3</s:String>
</ListBox>
项目1
项目2
项目3
我收到错误“无法在样式设置器上设置TargetName属性”。我的代码看起来像是高亮显示的相关代码。此外,如果我有一组我想要的setter,我可以将它们分组成一种样式然后引用它们吗?“TargetName”只能在模板(例如ControlTemplate、DataTemplate)中定义的触发器上设置。我假设您的DockPanel是ListBox的数据模板的一部分。如果是这种情况,则需要在该模板中定义IsMouseOver触发器,并将按钮的Setter移动到该模板中。