Search code examples
wpfstylesbasedon

WPF Style BasedOn parent Style in current context


Say, I have a default style for a TextBox 'TextBoxStyleBase'. I then define a DataGrid style which has an own TextBox style BasedOn that Base-style, defining another Border Color.

In some place inside a DataGrid I want to define another TextBox style but inherit from the one defined in DataGrid style.

Is there a way to make a style inherit from the style that is currently defined for a specific control in the current 'context'?

EDIT:

To make it more clear, here's what I have:

<!-- explicit style for all TextBoxes -->
<Style TargetType="{x:Type TextBox}" x:Key="TextStyle">
    <Setter Property="FontSize" Value="16"/>
</Style>

<!-- implicit style for all TextBoxes -->
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextStyle}"/>

<!-- DataGrid style changing inner TextBox style -->
<Style TargetType="{x:Type DataGrid}">
    <Style.Resources>
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextStyle}">
            <Setter Property="FontSize" Value="20"/>
        </Style>
        <!-- since TextBox has defined implicit style this would be equivalent to -->
        <!--<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
            <Setter Property="FontSize" Value="20"/>
        </Style>-->
    </Style.Resources>
</Style>

<Control>
    <DataGrid>
        <Row>
            <TextBox/> <!-- should show as defined in DataGrid style -->
        </Row>
        <Row>
            <Row.Resources>
                <Style TargetType="{x:Type TextBox}" BasedOn=" ??? ">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="FontWeight" Value="Bold"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Row.Resources>
            <TextBox/> <!-- should show with additional trigger -->
        </Row>
    </DataGrid>
</Control>

What to put in BasedOn = '???' so that the text shows up in FontSize 20 but Bold if hovered.


Solution

  • You cannot add two Styles with the same key inside the same ResourceDictionary. So if you already have defined an implicit Style without an x:Key in a ResourceDictionary for a specific type, you cannot add another one to the same ResourceDictionary.

    Otherwise you should be able to base a Style on the default style that is in scope like this:

    <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
        <Style.Triggers>
    
        </Style.Triggers>
    </Style>