2013-11-17 6 views
0

У меня есть следующий стиль:WPF Изменить значение собственности Элемента от BasedOn

<Style TargetType="{x:Type local:MetroTabControl}"> 
    <Style.Triggers> 
     <Trigger Property="SingleRow" Value="True"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type local:MetroTabControl}"> 
         <Grid> 
          <Grid KeyboardNavigation.TabNavigation="Local" SnapsToDevicePixels="True"> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="*"/> 
           </Grid.RowDefinitions> 
           <Grid> 
            <ScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden" Style="{DynamicResource TabPanelScrollViewer}"> 
             <TabPanel x:Name="HeaderPanel" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/> 
            </ScrollViewer> 
            <Button x:Name="AddTabItem" Content="&#xE109;" Style="{DynamicResource TabControlButton}" HorizontalAlignment="Right" VerticalAlignment="Top"/> 
           </Grid> 
           <Border Grid.Row="1" x:Name="TabPanelBorder" Background="Transparent"> 
            <Rectangle x:Name="TabPanelBorderRectangle" Fill="{StaticResource TabPanelBorderBrush}" Height="2"/> 
           </Border> 
           <Border Grid.Row="2" Background="{StaticResource TabControlBackground}"/> 
           <ContentPresenter Grid.Row="2" Name="PART_SelectedContentHost" ContentSource="SelectedContent"/> 
          </Grid> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <!--<Setter Property="Template" Value="{StaticResource MetroTabControlSingleRow}" />--> 
     </Trigger> 
     <Trigger Property="SingleRow" Value="False"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type local:MetroTabControl}"> 
         <Grid KeyboardNavigation.TabNavigation="Local" SnapsToDevicePixels="True"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <Border Background="Transparent" BorderThickness="0,0,0,2" BorderBrush="{StaticResource TabPanelBorderBrush}"> 
           <DockPanel LastChildFill="True"> 
            <Button x:Name="AddTabItem" Style="{DynamicResource TabControlButton}" DockPanel.Dock="Right"> 
             <Path Stroke="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Data="M0,4 H8 M4,0 V8" StrokeThickness="2" /> 
            </Button> 
            <TabPanel x:Name="HeaderPanel" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/> 
           </DockPanel> 
          </Border> 
          <Border Grid.Row="1" Background="{StaticResource TabControlBackground}"/> 
          <ContentPresenter Grid.Row="1" Name="PART_SelectedContentHost" ContentSource="SelectedContent"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <!--<Setter Property="Template" Value="{StaticResource MetroTabControlMultiRows}" />--> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Я хочу иметь другой стиль, BasedOn выше, но с одним изменением - я хочу, чтобы изменить Fill цвет в TabPanelBorderRectangle Rectangle.

Таким образом, чтобы использовать BasedOn я написал следующее:

<Style TargetType="{x:Type local:MetroTabControl}" BasedOn="{StaticResource {x:Type local:MetroTabControl}}"> 

</Style> 

Но я понятия не имею, как изменить цвет TabPanelBorderRectangle Rectangle из BasedOn стиля.

Я пытался что-то вроде

<Setter TargetName="TabPanelBorderRectangle" Property="Fill" Value="Red"/> 

, но он не работает (Имя_целевого_объект свойство не может быть установлено на стиль сеттер) ..

Как я могу это сделать?

ответ

1

В качестве состояний ошибки вы не можете использовать TargetName в настройщиках.

Как обходное решение, вы можете сделать это, вместо того, чтобы использовать для вашей кисти StaticResource, привяжите его, используя DynamicResource, чтобы мы могли воспользоваться поиском поведения в XAML.

<Rectangle x:Name="TabPanelBorderRectangle" 
      Fill="{DynamicResource TabPanelBorderBrush}"/> 

Теперь в вашем стиле вы можете override that brush, указав тот же ключ для кисти и предоставить значение цвета там.

<Style TargetType="{x:Type local:MetroTabControl}" 
     BasedOn="{StaticResource {x:Type local:MetroTabControl}}"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="TabPanelBorderBrush" Color="Green"/> 
    </Style.Resources> 
</Style> 

Поскольку brush является переплетен с помощью dynamic resource будет выбрать most local value из вашего ресурса стиля, который будет зеленый в описанном выше случае.

Смежные вопросы