2011-04-20 42 views
2

我如何应用样式到ContentControl中的内容。例如:WPF ContentControl中造型

<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> 

回答

4

编辑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> 

不幸的是,你不能风格DataGridTextColumns在Why can't I style a DataGridTextColumn?

而是说,我一般设置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(为什么你不会反正我想不出任何理由。)

+0

我看到在我的代码的XML是不完全。纠正问题 – SACO 2011-04-20 14:13:39

+0

@Malone,你想样式DataGrid中,或DataGridTextColumns?或两者? – Scott 2011-04-20 14:20:21

+0

@Malone,看样子你想拥有的每个数据网格中的不同的风格,所以我已经更新了我的例子来说明如何做到这一点。 – Scott 2011-04-20 15:01:45