2014-11-12 6 views
2

У меня есть MultiDataTrigger, где, если свойство в моей модели просмотра истинно И IsMouseOver на TabItem истинно, тогда граница должна выглядеть красной с толщиной 2.5.TabItem BorderBrush не обновляется при запуске IsMouseOver

Я не мог заставить работать и 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 истинно, независимо от того, что мышеловка зависает над 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> 
+0

Это связано с WPF. Это верно? Если да, добавьте тег WPF. – sfuqua

+0

Состояние, которое вы упомянули последним, является «IsMouseOver», хотя с использованием стиля Aero по умолчанию в Windows 7 кажется, что только красная «BorderBrush» применяется, когда вкладка действительно выбрана; граница курсора синева, если вкладка не выбрана. Возможно, вам потребуется настроить шаблон по умолчанию, чтобы получить нужные результаты. –

+0

У вас есть фоновый набор для вашего TabItem (даже прозрачный)? Я видел подобную проблему с сеткой, потому что по умолчанию свойство background имеет значение null и не будет использоваться для тестирования ударов. – Chris

ответ

1

Вы заметите, что следующее условие работа, но только тогда, когда выбрана вкладка:

<Condition Binding="{Binding IsMouseOver RelativeSource={RelativeSource Self}}" 
      Value="true" /> 

Вот почему: обратите внимание на этот отрывок из шаблона TabItem по умолчанию для темы Aero.

<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="IsSelected" 
       Value="false"/> 
    <Condition Property="IsMouseOver" 
       Value="true"/> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="{StaticResource TabItemHotBorderBrush}"/> 
</MultiTrigger> 

стиль переопределяет BorderBrush курсор мыши над когда язычок не выбран, так что ваша граница кисть не будет применяться в этом случае.

Поскольку сеттер использует StaticResource для ссылки TabItemHotBorderBrush, вы не можете просто переопределить этот ресурс своей собственной кистью. Вероятно, вам придется переопределить шаблон по умолчанию.

+0

У вас есть ссылка на шаблон TabItem по умолчанию? Я нашел его, но он не имеет таких же условий запуска, как тот, который вы опубликовали. Благодаря! – jsirr13

+1

Он поставляется с Blend в папке 'SystemThemes'. Если у вас его нет, я скопировал содержимое в [этот текст] (https://gist.github.com/mstrobel/c8bcd50ece7abf5fc9fc). Обратите внимание, что файл имеет стили Aero для ** всех ** элементов управления. Вам придется просеять их, чтобы найти соответствующие. –