15

私は非常に奇妙な問題に遭遇しています。内のいくつかのコントロールにグローバル スタイルを適用しようとしていますDataGrid。それらのほとんどは、私が期待するとおりに機能します。ただし、 のスタイリングTextBlockは適用されません。、、、および他のいくつかのスタイルはすべてComboBox、それぞれのコントロールに適用されますが、. コードを可能な限り単純化しましたが、問題はまだ存在しています。以下にコードサンプルを提供しました。TextBoxLabelTextBlock

スタイルを に適用する必要があり、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正しく機能します。
  • 内でグローバル スタイルを定義すると、DataTemplate適切に機能します。
  • TextBlockを使用してにスタイルを直接割り当てると機能しx:Keyます。
  • DataGridCell使用するグローバル スタイルTextElement.PROPERTYが に適用されますTextBlock

これらの一部は に適用されるスタイルを取得しますTextBlockが、独自の問題があります。スタイルを直接割り当てたり、 内のどこかでスタイルを定義したりすると、DataGridColumnそのスタイルを複数回適用する必要があります。でを使用すると、スタイルがコントロール以外にも適用され、TextElement.PROPERTY設定できるプロパティの数が制限されます。DataGridCellTextBlock

4

2 に答える 2

9

したがって、もう少し掘り下げて少し運が良かったので、WPF がTargetTypeから派生しない限り、テンプレート内に暗黙的なスタイルを適用しないことを発見しましたControl。はからTextBlock派生していないためControl、そのスタイルは適用されません。したがって、手動ですべての非にスタイルを適用するかControl、テンプレート内で暗黙のスタイルを定義する必要があります。

次の MSDN ブログ投稿では、かなり詳細に説明しています。

https://docs.microsoft.com/en-us/archive/blogs/wpfsdk/implicit-styles-templates-controls-and-frameworkelements

于 2012-10-16T23:13:50.287 に答える
3

残念ながら、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>
于 2012-10-06T09:53:23.147 に答える