WPF ContentControl Styling - PullRequest
       9

WPF ContentControl Styling

2 голосов
/ 20 апреля 2011

Как я могу применить стиль к контенту управления контентом. Например:

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

1 Ответ

4 голосов
/ 20 апреля 2011

РЕДАКТИРОВАТЬ 2: Похоже, вы пытаетесь применить разные стили для каждой из ваших DataGrids. Для этого вам нужно определить их конкретный стиль в разделе ресурсов каждого ContentControl. Если стили определены в другом месте, вы всегда можете создать новый стиль на основе стиля, определенного в другом месте, как показано ниже

Фон первого DoCPanel ContentControl будет черным. Вторым будет синий.

<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 - для вашего примера, я думаю, вы хотите что-то вроде этого (однако я не могу проверить это, так как у меня нет доступа к вашему пространству имен 'Controls'):

<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, как указано в Почему я не могу стилизовать DataGridTextColumn?

Вместо этого я обычно устанавливаю для CellStyle объекта DataGridTextColumn значение 'style':

<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 для каждого столбца (я не могу придумать причину, по которой вы бы не стали).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...