2013-12-04 1 views
1

У меня проблема с триггером IsMouveOver с элементом TabItem.WPF - TabItem MouseOver не работает по назначению

Когда курсор мыши находится на TabItem, меняется его цвет фона, который я хочу => Он работает. Однако цвет фона TabItem также изменяется, когда мой курсор мыши находится внутри элемента TabItem.

Вот XAML, связанные с моделированием:

<Style x:Key="SupTest" TargetType="{x:Type TabItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Border Margin="2" Name="TabBorder" CornerRadius="6" BorderBrush="Transparent" Background="Transparent" 
         BorderThickness="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
        <StackPanel Margin="12" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <Rectangle Width="25" Height="25" Fill="Blue" HorizontalAlignment="Left" Margin="00,0,0,0"></Rectangle> 
         <ContentPresenter ContentSource="Header" VerticalAlignment="Center" 
              HorizontalAlignment="Stretch" Margin="10,0,0,0"></ContentPresenter> 
        </StackPanel> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Panel.ZIndex" Value="100" /> 
         <Setter TargetName="TabBorder" Property="Background" Value="#FFDFDFDF" /> 
         <Setter TargetName="TabBorder" Property="BorderThickness" Value="2" /> 
         <Setter TargetName="TabBorder" Property="BorderBrush" Value="{DynamicResource WindowTitleColorBrush}"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="TabBorder" Property="Background" Value="DarkRed" /> 
         <Setter TargetName="TabBorder" Property="BorderBrush" Value="Black" /> 
         <Setter Property="Foreground" Value="DarkGray" /> 
        </Trigger> 
        <Trigger Property="Border.IsMouseOver" Value="True"> 
         <Setter TargetName="TabBorder" Property="Background" Value="{DynamicResource WindowTitleColorBrush}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

И код XAML для самого окна:

<TabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TabStripPlacement="Left" 
       BorderThickness="1,0,0,0" BorderBrush="{DynamicResource WindowTitleColorBrush}"> 
     <TabItem Header="Item #1" Style="{StaticResource SupTest}"> 
      <Grid> 
       <Button Content="Button" HorizontalAlignment="Left" Margin="10" VerticalAlignment="Top" Width="75"/> 
      </Grid> 
     <TabItem Header="Item #2" Style="{StaticResource SupTest}"> 
      <Grid> 
       <Button Content="Button Teeest" HorizontalAlignment="Left" Margin="10" VerticalAlignment="Top" Width="75"/> 
      </Grid> 
     </TabItem> 
    </TabControl> 

С помощью этого кода, например, IsMouseOver из TabItem срабатывает, когда курсор мыши находится на кнопке, которую он содержит.

Как это исправить? : P

Спасибо за помощь =)

+0

Вы пробовали '' –

+0

@ sa_ddam213 У меня есть сейчас: P Но это не сработало, это событие не срабатывает вообще, что бы я ни делал. Спасибо за предложение, хотя =) – MagiKruiser

ответ

4

Это не работает, потому что Border в качестве контейнера принимает все события, и MouseOver не является исключением. Если вы хотите проигнорировать событие MouseOver для некоторой части (вашей внутренней части элемента), тогда просто поместите внутренний предмет поверх более широкого предмета.

Вы можете добавить управление сеткой под внутреннюю часть и связать Trigger с ее событием MouseOver.

<Border Margin="2" Name="TabBorder" CornerRadius="6" BorderBrush="Transparent" Background="Transparent" 
BorderThickness="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
<Grid> 
    <Grid x:Name="gridMouseOver"/> 
    <StackPanel Margin="12" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <Rectangle Width="25" Height="25" Fill="Blue" HorizontalAlignment="Left" Margin="00,0,0,0"></Rectangle> 
      <ContentPresenter ContentSource="Header" VerticalAlignment="Center" 
        HorizontalAlignment="Stretch" Margin="10,0,0,0"></ContentPresenter> 
     </StackPanel> 
</Grid> 
</Border> 
<ControlTemplate.Triggers> 
<Trigger Property="IsSelected" Value="True"> 
    <Setter Property="Panel.ZIndex" Value="100" /> 
    <Setter TargetName="TabBorder" Property="Background" Value="#FFDFDFDF" /> 
    <Setter TargetName="TabBorder" Property="BorderThickness" Value="2" /> 
    <Setter TargetName="TabBorder" Property="BorderBrush" Value="{DynamicResource WindowTitleColorBrush}"/> 
</Trigger> 
<Trigger Property="IsEnabled" Value="False"> 
    <Setter TargetName="TabBorder" Property="Background" Value="DarkRed" /> 
    <Setter TargetName="TabBorder" Property="BorderBrush" Value="Black" /> 
    <Setter Property="Foreground" Value="DarkGray" /> 
</Trigger> 
<Trigger SourceName="gridMouseOver" Property="IsMouseOver" Value="True"> 
    <Setter TargetName="TabBorder" Property="Background" Value="{DynamicResource WindowTitleColorBrush}"/> 
</Trigger> 
</ControlTemplate.Triggers> 
+0

Спасибо, помогло много и проблема решена сейчас: P – MagiKruiser

2

немного старый вопрос, но это беспокоило меня весь день ....

<MultiDataTrigger.Conditions> 
    <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true" /> 
    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="false"/> 
    <Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" Value="Top"/> 
</MultiDataTrigger.Conditions> 

Это решило для меня

игнорирует курсор на активной вкладке

Надеюсь, что это поможет любому, у кого есть эта проблема.

+0

Путь проще, чем принятый ответ, работал как шарм для меня –

+0

может указать, где поставить этот код? –