Wpf TabItem上IsMouseOver的触发器
我的Wpf TabItem上IsMouseOver的触发器,wpf,xaml,Wpf,Xaml,我的TabItem样式有一些问题。风格如下: <Style TargetType="{x:Type TabItem}"> <Setter Property="Width" Value="160"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Height" Value="70"/> <Setter Propert
TabItem
样式有一些问题。风格如下:
<Style TargetType="{x:Type TabItem}">
<Setter Property="Width" Value="160"/>
<Setter Property="Background" Value="Transparent" />
<Setter Property="Height" Value="70"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border Name="Border" Background="Transparent">
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Left"
ContentSource="Header"
Margin="10,2"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="Red" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Green" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="Blue" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
有了这段代码,IsMouseOver不再是通过移动子元素触发的,而是引入了另一个问题。仅当光标位于tabitem的标题上时,才会触发IsMouseOver事件。另一个用户描述了相同的问题。建议的答案是将Background=“Transparent”值添加到边框中,但这对我不起作用。如果我正确理解了您的问题,您所要做的就是将
触发器上的SourceName
从ContentSite
更改为边框
请尝试以下样式:
<Style TargetType="{x:Type TabItem}">
<Setter Property="Width" Value="160"/>
<Setter Property="Background" Value="Transparent" />
<Setter Property="Height" Value="70"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border Name="Border" Background="Transparent">
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Left"
ContentSource="Header"
Margin="10,2"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="Red" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Green" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True" SourceName="Border">
<Setter TargetName="Border" Property="Background" Value="Blue" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果您不希望在标题和子元素处触发IsMouseOver,那么什么时候触发它?那剩下什么?这就是TabItem的全部功能。:)您希望仅在选项卡标题上触发事件,还是仅在内容上触发事件,或者两者都触发事件?我希望仅在选项卡标题上触发事件。通过添加SourceName=“ContentSite”,只有当光标位于TabItem.Header内的TextBlock上时才会触发事件。我希望当光标位于整个TabItem区域160x70上时才会触发事件,而不仅仅是当光标位于TabItem.Header内的TextBlock上时。我希望这能澄清困惑。
<Style TargetType="{x:Type TabItem}">
<Setter Property="Width" Value="160"/>
<Setter Property="Background" Value="Transparent" />
<Setter Property="Height" Value="70"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border Name="Border" Background="Transparent">
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Left"
ContentSource="Header"
Margin="10,2"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="Red" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Green" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True" SourceName="Border">
<Setter TargetName="Border" Property="Background" Value="Blue" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" SourceName="Border" Value="True" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="Border" Property="BorderBrush" Value="Blue" />
</MultiTrigger>