WPF глобальный стиль TextBlock внутри DataGrid

я столкнулся с очень странной проблемой. Я пытаюсь применить глобальный стиль к нескольким элементам управления в DataGrid. Большинство из них работают именно так, как я ожидал. Однако стиль для TextBlock никогда не применяется. Стили для ComboBox, TextBox, Label, и несколько других все применяются к их соответствующим элементам управления, но не TextBlock. Я максимально упростил код, и проблема все еще присутствует. Я предоставил образец кода под.

мне нужен стиль, который будет применен к TextBlock и я не хочу применять его вручную к TextBlock.

<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="ANY_TEXTBLOCK_PROPERTY" Value="VALUE" />
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Test">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="Globably Applied" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Дополнительная Информация:

  • глобальные стили для любого элемента управления, кроме TextBlock (TextBox, ComboBox, etc.) работать правильно.
  • определение глобального стиля внутри DataTemplate будет работать должным образом.
  • непосредственно присвоение стиля TextBlock С помощью x:Key будет работа.
  • глобальные стили для DataGridCell используя TextElement.PROPERTY будет применяться к TextBlock.

в то время как некоторые из них будет применен стиль к TextBlock, у них есть собственные проблемы. Прямое назначение стиля или определение стиля где-то в пределах DataGridColumn будет означать, что мне придется применить стиль более одного раза. С помощью TextElement.PROPERTY на DataGridCell применить стиль больше, чем просто TextBlock элементы управления и ограничат количество свойств это вы можете установить.

2 ответов


так что с немного больше копать и немного удачи, я обнаружил, что WPF не применяет неявные стили внутри шаблонов, если TargetType происходит от Control. С TextBlock не является производным от Control, его стиль не применяется. Таким образом, вы либо должны вручную применить стиль к каждому не-Control или определите неявный стиль внутри шаблона.

следующее сообщение в блоге MSDN объясняет это довольно хорошо деталь.

http://blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx


к сожалению, как BrianP сказал, WPF не работает. Но можно установить свойства TextElement стиля ячейки следующим образом:

<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False" DockPanel.Dock="Top">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="TextElement.Foreground" Value="Green" />
        </Style>
    </DataGrid.CellStyle>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Test">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="not globably applied" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>