1

Josh Smith の MVVM ワークスペース モデルに従う MainWindow.xaml に次のコードがあります。

<Grid Grid.Row="1" 
      Grid.RowSpan="2">
    <ContentControl
        Content="{Binding}" 
        ContentTemplate="{StaticResource WorkspaceTemplate}">
    </ContentControl>
</Grid>

最初にワークスペース テンプレートがあった場所

<DataTemplate x:Key="WorkspaceTemplate">
    <TabControl x:Name="tabControl" 
                IsSynchronizedWithCurrentItem="true" 
                ItemsSource="{Binding Workspaces}" 
                SelectedIndex="{Binding SelectedIndex}"
                HorizontalContentAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch" 
                TabStripPlacement="Top" 
                Margin="5,0,5,0">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Path=DisplayName}"/>
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>
</DataTemplate>

TabControlこれで、別のリソース ディクショナリに含まれる閉じるボタンのあるスタイルを作成しました。このためのコードは次のようなものです

<Style x:Key="StudioTabControl" TargetType="{x:Type TabControl}">
    <Style.Resources>
        <Style x:Key="StudioTabItem" TargetType="{x:Type TabItem}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Height="20" 
                              Background="{TemplateBinding Background}" 
                              SnapsToDevicePixels="True">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="35"/>
                            </Grid.ColumnDefinitions>
                            <ContentPresenter Grid.Column="0" 
                                              Margin="10,0,10,0" 
                                              HorizontalAlignment="Center" 
                                              VerticalAlignment="Center" 
                                              ContentSource="Header" />
                            <Button Grid.Column="1" 
                                    Width="15" 
                                    Height="15" 
                                    HorizontalAlignment="Center" 
                                    VerticalAlignment="Center" 
                                    DockPanel.Dock="Right">
                            ... ect.

StudioTabControl問題は、このスタイルを自分の定義にどのように継承できるか<DataTemplate x:Key="WorkspaceTemplate">です。現在、私は試しました

<DataTemplate x:Key="WorkspaceTemplate">
    <TabControl x:Name="tabControl" 
                ItemsSource="{Binding Workspaces}" 
                SelectedIndex="{Binding SelectedIndex}"
                Style="{StaticResource StudioTabControl}"
                ... ect.

しかし、定義で指定<TabControl.ItemContainerStyle>...した<DataTemplate x:Key="WorkspaceTemplate">ため、スタイルが機能しません。自分のStudioTabItemスタイルを既存の で動作させるにはどうすればよいWorkspaceTemplateですか?

御時間ありがとうございます。

4

3 に答える 3

3

それがどのようにスタイルを継承しているのかわかりません。「WorkspaceTemplate」内で「StudioTabControl」スタイルを使用する場合は、それを使用してください。

<TabControl x:Name="tabControl" 
                IsSynchronizedWithCurrentItem="true" 
                ItemsSource="{Binding Workspaces}" 
                SelectedIndex="{Binding SelectedIndex}"
                HorizontalContentAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch" 
                TabStripPlacement="Top" 
                Style="{StaticResource StudioTabControl}"
                Margin="5,0,5,0">

StudioTabItem の TargetType は TabControl ではなく TabItem であるため、TabItem スタイルではなく、探している TabControl スタイルであるため、適用されません。

または、スタイルの継承を本当に探している場合は、このリンクをご覧ください。

于 2013-09-04T15:56:46.730 に答える
1

BasedOnスタイルから継承するために使用します。

 <Style TargetType="TabItem" BasedOn="{StaticResource StudioTabItem}">
            <Setter Property="Header" Value="{Binding Path=DisplayName}"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
  </Style>

StudioTabItem「TabItem」スタイル定義からアクセスできるように定義する必要があるため、定義する前にこれを定義しTabItemます。

 <Style x:Key="StudioTabItem" TargetType="{x:Type TabItem}"> 
于 2013-09-04T15:57:17.820 に答える
1

任意の要素の Resources で定義されたリソースは、その要素内でのみ使用できるため、定義したスタイルは要素のTabControl.Style外では使用できないため、適用されません。

したがって、そのスタイルを使用するにTabcontrol.Styleは、リソース ディクショナリでタブ コントロール スタイルと並行して定義します。

次に、スタイルをキーで定義した場合、それは自動的に適用されません。を使用して明示的に適用する必要があります{StaticResource=Key}.

tabcontrol.Style の外で定義すると、ItemContainerStyle の BasedOn キーワードを使用して継承できます。

<Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource StudioTabItem}">

ありがとう

于 2013-09-04T17:04:58.767 に答える