У меня есть MultiDataTrigger, где, если свойство в моей модели представления истинно И IsMouseOver на TabItem истинно, тогда граница должна отображаться красной с толщиной 2,5.
Мне не удалось заставить работать и свойство, и IsMouseOver, поэтому я попробовал только свое свойство. Это работало правильно, но все еще имело ожидаемую проблему, когда он был красным с толщиной 2,5, пока я не навел курсор на вкладку. Затем я попытался удалить свойство модели представления и просто использовал проверку IsMouseOver в качестве условия. Это не работает. Ниже приведен код только с IsMouseOver.
<TabItem x:Name="TabItemNotWorking" Header="NotWorking">
<TabItem.Style>
<Style TargetType="TabItem">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver RelativeSource={RelativeSource Self}}" Value="true" />
<!--<Condition Binding="{Binding Counter, Converter={StaticResource IntIsGreaterThanZeroToBool}}" Value="true" />-->
</MultiDataTrigger.Conditions>
<Setter Property="TabItem.BorderBrush" Value="Red"/>
<Setter Property="TabItem.BorderThickness" Value="2.5"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TabItem.Style>
<!--Content in here-->
</TabItem>
Я исправил это, воспользовавшись советом Майка Стробеля перезаписать шаблон TabItem. Теперь моя красная рамка будет отображаться всякий раз, когда мое свойство ViewModel имеет значение true, независимо от того, наведен ли указатель мыши на TabItem. Вот мое решение (я добавляю комментарии к измененным участкам кода):
<LinearGradientBrush x:Key="TabItemHotBackground"
StartPoint="0,0"
EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#EAF6FD"
Offset="0.15"/>
<GradientStop Color="#D9F0FC"
Offset=".5"/>
<GradientStop Color="#BEE6FD"
Offset=".5"/>
<GradientStop Color="#A7D9F5"
Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<SolidColorBrush x:Key="TabItemSelectedBackground"
Color="#F9F9F9"/>
<SolidColorBrush x:Key="TabItemDisabledBackground"
Color="#F4F4F4"/>
<SolidColorBrush x:Key="TabItemHotBorderBrush"
Color="#3C7FB1"/>
<SolidColorBrush x:Key="TabItemDisabledBorderBrush"
Color="#FFC9C7BA"/>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid SnapsToDevicePixels="true">
<Border Name="Bd"
Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
BorderThickness="1,1,1,0">
<ContentPresenter Name="Content"
ContentSource="Header"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
HorizontalAlignment="{Binding Path=HorizontalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
VerticalAlignment="{Binding Path=VerticalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
RecognizesAccessKey="True"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Bd" Property="Background" Value="{StaticResource TabItemHotBackground}"/>
</Trigger>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Panel.ZIndex" Value="1"/>
<Setter TargetName="Bd" Property="Background" Value="{StaticResource TabItemSelectedBackground}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="false"/>
<Condition Property="IsMouseOver" Value="true"/>
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource TabItemHotBorderBrush}"/>
</MultiTrigger>
<!--HERE ARE THE START OF MY CHANGES-->
<DataTrigger Binding="{Binding Counter, Converter={StaticResource IntIsGreaterThanZeroToBool}}" Value="true">
<Setter TargetName="Bd" Property="BorderBrush" Value="Red"/>
<Setter TargetName="Bd" Property="BorderThickness" Value="2.5"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" Value="true" />
<Condition Binding="{Binding Counter, Converter={StaticResource IntIsGreaterThanZeroToBool}}" Value="true" />
</MultiDataTrigger.Conditions>
<Setter TargetName="Bd" Property="BorderBrush" Value="Red"/>
<Setter TargetName="Bd" Property="BorderThickness" Value="2.5"/>
</MultiDataTrigger>
<!--HERE ARE THE END OF MY CHANGES-->
<Trigger Property="TabStripPlacement" Value="Bottom">
<Setter TargetName="Bd" Property="BorderThickness" Value="1,0,1,1"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Left">
<Setter TargetName="Bd" Property="BorderThickness" Value="1,1,0,1"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Right">
<Setter TargetName="Bd" Property="BorderThickness" Value="0,1,1,1"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Top"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-2,-2,-1"/>
<Setter TargetName="Content" Property="Margin" Value="0,0,0,1"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Bottom"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-1,-2,-2"/>
<Setter TargetName="Content" Property="Margin" Value="0,1,0,0"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Left"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-2,-1,-2"/>
<Setter TargetName="Content" Property="Margin" Value="0,0,1,0"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Right"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-1,-2,-2,-2"/>
<Setter TargetName="Content" Property="Margin" Value="1,0,0,0"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="Bd" Property="Background" Value="{StaticResource TabItemDisabledBackground}"/>
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource TabItemDisabledBorderBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
IsMouseOver
, о котором вы упоминали в последний раз, работает для меня, хотя со стилем Aero по умолчанию в Windows 7 кажется, что красныйBorderBrush
применяется только тогда, когда вкладка фактически выбрана.; граница при наведении становится голубоватой, когда вкладка не выбрана. Возможно, вам придется изменить шаблон по умолчанию, чтобы получить желаемые результаты. - person Mike Strobel   schedule 12.11.2014