2011-04-20 43 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