【问题标题】:WPF ContentControl StylingWPF 内容控件样式
【发布时间】:2011-08-09 12:45:15
【问题描述】:

如何将样式应用于内容控件的内容。例如:

<Window.Resources>
    <Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False">
        <Controls:DataGrid.Columns>
            <Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
            <Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
        </Controls:DataGrid.Columns>
    </Controls:DataGrid>
</Window.Resources>

<StackPanel>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}" Style="DataGridStyle1"></ContentControl>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}" Style="DataGridStyle2"></ContentControl>
</StackPanel>

【问题讨论】:

    标签: wpf styles contentcontrol


    【解决方案1】:

    编辑 2:看起来您正在尝试对每个 DataGrid 应用不同的样式。为此,您需要在每个 ContentControl 的资源部分中定义它们的特定样式。如果样式在别处定义,您始终可以根据别处定义的样式创建新样式,如下所示

    第一个 ContentControl 的 DockPanel 的背景将为黑色。第二个将是蓝色。

    <Window.Resources>
        <Style TargetType="DockPanel" x:Key="DockStyle1">
            <Setter Property="Background" Value="Black" />
        </Style>
        <Style TargetType="DockPanel" x:Key="DockStyle2">
            <Setter Property="Background" Value="Blue" />
        </Style>
        <DockPanel x:Key="MyDockPanel">
            <Rectangle Fill="Green" DockPanel.Dock="Top" Height="20" Width="50" />
            <Rectangle Fill="Red" DockPanel.Dock="Top" Height="20" Width="20" />
            <Rectangle Fill="Yellow" DockPanel.Dock="Bottom" Height="20" Width="50" />
        </DockPanel>
    </Window.Resources>
    <StackPanel>
        <StackPanel>
            <ContentControl Content="{StaticResource MyDockPanel}">
                <ContentControl.Resources>
                    <Style TargetType="{x:Type DockPanel}" BasedOn="{StaticResource DockStyle1}" />
                </ContentControl.Resources>
            </ContentControl>
            <ContentControl Content="{StaticResource MyDockPanel}">
                <ContentControl.Resources>
                    <Style TargetType="DockPanel" BasedOn="{StaticResource DockStyle2}" />
                </ContentControl.Resources>
            </ContentControl>
        </StackPanel>
    </StackPanel>
    

    编辑 3 - 对于您的示例,我认为您想要这样的东西(但是我无法测试这个,因为我无权访问您的“控件”命名空间):

    <Window.Resources>
        <Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False">
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
                <Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
            </Controls:DataGrid.Columns>
        </Controls:DataGrid>
    </Window.Resources>
    
    <StackPanel>
        <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}">
            <ContentControl.Resources>
                <Style TargetType="{x:Type Controls:DataGrid}" BasedOn="{StaticResource DataGridStyle1}" />
            </ContentControl.Resources>
        </ContentControl>
        <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}">
            <ContentControl.Resources>
                <Style TargetType="{x:Type Controls:DataGrid}" BasedOn="{StaticResource DataGridStyle2}" />
            </ContentControl.Resources>
        </ContentControl>
    </StackPanel>
    

    很遗憾,您不能像 Why can't I style a DataGridTextColumn? 中所述设置 DataGridTextColumns 样式

    相反,我通常将 DataGridTextColumn 的 CellStyle 设置为“样式”:

    <Style TargetType="DataGridCell" x:Key="DataGridCenteredText">
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
    </Style>
    
    <DataGridTextColumn Header="Centered Text" CellStyle="{StaticResource DataGridCenteredText}" Binding="{Binding Path=MyData}" />
    

    我认为您需要在每列的基础上定义 CellStyle(我想不出您为什么不这样做的任何原因。)

    【讨论】:

    • 我看到我的代码中的 xml 不完整。更正的问题
    • @Malone,您要设置 DataGrid 还是 DataGridTextColumns 的样式?还是两者兼而有之?
    • @Malone,看来您正在尝试为每个 DataGrid 设置不同的样式,因此我更新了示例以展示如何做到这一点。
    • 两者:DataGrid 和 DataGrid.Columns
    • @Malone,我提供了一个使用您的代码的示例(尽管我无法测试它,因为我没有您的 Controls 命名空间,也没有您的业务类可以绑定) .但是,它应该非常接近我提供的内容。此外,我还添加了关于 DataGridTextColumns 的注释,因为这是一个完全不同的野兽。