none
TabControlのバインド時のThemeについて RRS feed

  • 質問

  • WPFのタブについて、タブのコンテンツをバインディングしようとしたのですが、ひとつだけ問題が出てきました。

    以下のようなコードを書いたとき、バインディングをしてある上のほうだけTabItemのThemeが反映されません。下のように書くと、TabItemにもThemeが反映されます。

    <UserControl x:Class="HogeApp.GUI"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:params="http://schemas.codeplex.com/elysium/params"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300" >
        <UserControl.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Elysium;component/Themes/Generic.xaml"/><!-ここだけ書けばElysiumのThemeが通るはず--->
                    <ResourceDictionary Source="/HogeApp;component/GUI/ColorBrushes.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </UserControl.Resources>
        <Grid>
            
            <Grid.RowDefinitions>
                <RowDefinition Height="34*"/>
                <RowDefinition Height="41*"/>
            </Grid.RowDefinitions>
            <TabControl ItemsSource="{Binding Pages}"><!--こっちだけElysiumのThemeが適用されない-->
                <TabControl.ItemContainerStyle>
                    <Style TargetType="TabItem">
                        <Setter Property="Header" Value="{Binding Title}"/>
                        <Setter Property="Content" Value="{Binding TabContent}"/>
                    </Style>
                </TabControl.ItemContainerStyle>
            </TabControl>
            <TabControl Grid.Row="1"><!--こっちはElysiumのThemeが適用される-->
                <TabItem Header="Test">
                    <StackPanel/>
                </TabItem>
                <TabItem Header="Test2">
                    <StackPanel/>
                </TabItem>
            </TabControl>
        </Grid>
    </UserControl>

    使用しているThemeのライブラリはElysium 2.0 SP2ですが、下の適用ができることから、Elysium固有の問題ではなく、僕のこのコードの問題だと思うのですが、TabItemにもThemeを適用するにはどうしたらいいのでしょう。

    2013年7月21日 2:50

回答

  • 適用されないという方のTabControlでTamItemのスタイルを定義しているからでは?
    スタイルを継承したうえでSetterを追加したければBasedOnで元になるスタイルを指定する必要があります。

    <UniformGrid Rows="3" Columns="1" Language="ja-jp" >
        <UniformGrid.Resources>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}" >
                            <Grid >
                                <Border Name="border"  BorderBrush="Blue" BorderThickness="1" Padding="4,1,4,1"  >
                                    <ContentPresenter Content="{TemplateBinding Header}"/>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers >
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter  TargetName="border" Property="Background" Value="LightBlue" />
                                </Trigger>
                            </ControlTemplate.Triggers >
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
            <x:Array x:Key="testSource"
                Type="{x:Type sys:DateTime}" xmlns:sys="clr-namespace:System;assembly=mscorlib" >
                <sys:DateTime>2011/1/1</sys:DateTime>
                <sys:DateTime>2012/1/1</sys:DateTime>
                <sys:DateTime>2013/1/1</sys:DateTime>
            </x:Array>
    
        </UniformGrid.Resources>
        <TabControl ItemsSource="{StaticResource ResourceKey=testSource}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem" BasedOn="{StaticResource ResourceKey={x:Type TabItem}}"> <!-- BasedOnでスタイルを継承する -->
                    <Setter Property="Header" Value="{Binding Year}"/>
                    <Setter Property="Content" Value="{Binding .}"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
        <TabControl ItemsSource="{StaticResource ResourceKey=testSource}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header" Value="{Binding Year}"/>
                    <Setter Property="Content" Value="{Binding .}"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
        <TabControl >
            <TabItem Header="Test">
                <StackPanel/>
            </TabItem>
            <TabItem Header="Test2">
                <StackPanel/>
            </TabItem>
        </TabControl>
    </UniformGrid>


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2013年7月21日 13:41

すべての返信

  • 適用されないという方のTabControlでTamItemのスタイルを定義しているからでは?
    スタイルを継承したうえでSetterを追加したければBasedOnで元になるスタイルを指定する必要があります。

    <UniformGrid Rows="3" Columns="1" Language="ja-jp" >
        <UniformGrid.Resources>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}" >
                            <Grid >
                                <Border Name="border"  BorderBrush="Blue" BorderThickness="1" Padding="4,1,4,1"  >
                                    <ContentPresenter Content="{TemplateBinding Header}"/>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers >
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter  TargetName="border" Property="Background" Value="LightBlue" />
                                </Trigger>
                            </ControlTemplate.Triggers >
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
            <x:Array x:Key="testSource"
                Type="{x:Type sys:DateTime}" xmlns:sys="clr-namespace:System;assembly=mscorlib" >
                <sys:DateTime>2011/1/1</sys:DateTime>
                <sys:DateTime>2012/1/1</sys:DateTime>
                <sys:DateTime>2013/1/1</sys:DateTime>
            </x:Array>
    
        </UniformGrid.Resources>
        <TabControl ItemsSource="{StaticResource ResourceKey=testSource}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem" BasedOn="{StaticResource ResourceKey={x:Type TabItem}}"> <!-- BasedOnでスタイルを継承する -->
                    <Setter Property="Header" Value="{Binding Year}"/>
                    <Setter Property="Content" Value="{Binding .}"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
        <TabControl ItemsSource="{StaticResource ResourceKey=testSource}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header" Value="{Binding Year}"/>
                    <Setter Property="Content" Value="{Binding .}"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
        <TabControl >
            <TabItem Header="Test">
                <StackPanel/>
            </TabItem>
            <TabItem Header="Test2">
                <StackPanel/>
            </TabItem>
        </TabControl>
    </UniformGrid>


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2013年7月21日 13:41
  • ありがとうございました。

    僕の初歩的な間違いなのに、丁寧にしかもこんなに詳しくコードを書いていただいて非常に助かりました。

    2013年7月21日 14:06