1

DataTemplateを使用して、いくつかのTabItemのヘッダーを変更したいと思います。これまでのところ、私はこのコードを持っていますが、これは正常に機能します:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"  x:Class="SFgame.MainWindow"
        Title="SoccerFusion" Height="600" Width="1000" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <TabControl TabStripPlacement="Bottom">
            <TabControl.Resources>
                <Style TargetType="{x:Type TabPanel}">
                    <Setter Property="HorizontalAlignment" Value="Center" />
                </Style>
                <DataTemplate x:Key="mmHeaderTemplate">
                    <Image Name="mmItem1" />
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="True">
                            <Setter TargetName="mmItem1" Property="Source" Value="data\Images\Menu\ActiveItem.png" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="False">
                            <Setter TargetName="mmItem1" Property="Source" Value="data\Images\Menu\InactiveItem.png" />
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </TabControl.Resources>
            <TabItem Height="32" Width="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" IsSelected="True">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
            <TabItem Height="32" Width="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" >
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
            <TabItem Height="32" Width="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" >
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
            <TabItem Height="32" Width="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" >
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

唯一の問題は、すべてのTabItemヘッダーが同じ画像を持っていることです。すべてのTabItemには、アクティブと非アクティブの異なる画像のペアが必要です。

ですから、画像のパスをパラメータとして渡すと思いますが、それがどのように機能するのか理解できません。

私が見つけることができる唯一のものは、「パラメータを渡せない」です。

それが本当にうまくいかない場合。代替手段はありますか?たとえば、TabItemに「TabItem1」のような名前を付け、パス「data \ Images \ Menu\Tabitem1_active.png」と「data\Images \ Menu \ Tabitem1_inactive.png」をソースとして使用しますか?Binding-Sourceの名前を文字列に挿入できますか?

編集:私は解決策に少し近づいています

<Setter TargetName="mmItem1" Property="Source">
    <Setter.Value>
        <MultiBinding StringFormat="{}{0}{1}{2}">
            <Binding Mode="OneTime" Source="data\Images\Menu\" />
            <Binding Mode="OneTime" Source="??????" />
            <Binding Mode="OneTime" Source="inactive.png" />
        </MultiBinding>
    </Setter.Value>
</Setter>

上のコードの代わりにこのコードを使用すると、3つの文字列を連結できます。私が今必要としているのは、sourcecontrol/bindingsourceの名前だけです。

次の編集:私は少し近づいていると思います。TabItemのヘッダーを使用して、TabItemからテンプレートに文字列を取得することに成功しました。

コードは次のようになります。

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SoccerFusion" Height="400" Width="400">
  <Grid>
    <TabControl TabStripPlacement="Bottom">
        <TabControl.Resources>
            <Style TargetType="{x:Type TabPanel}">
                <Setter Property="HorizontalAlignment" Value="Center" />
            </Style>
            <DataTemplate x:Key="mmHeaderTemplate">
              <Grid>
                <Image Name="mmImg" />
                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, StringFormat='{}{0}'}" />
              </Grid>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="True">
                    ????? HERE COMES THE PROBLEM ??????
                        <Setter TargetName="mmImg" Property="Source" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, StringFormat='{}{0}active.png'}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="False">
                    ????? HERE COMES THE PROBLEM ??????
                        <Setter TargetName="mmImg" Property="Source" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, StringFormat='{}{0}inactive.png'}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </TabControl.Resources> 
        <TabItem Height="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" IsSelected="True" Header="mmItem1">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Height="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" Header="mmItem2" >
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Height="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" Header="mmItem3" >
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Height="32" HeaderTemplate="{StaticResource mmHeaderTemplate}" Header="mmItem4" >
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
    </TabControl>
  </Grid>
</Page>

問題は次のとおりです。文字列を生成し、それをソースとして画像に渡します。これは問題なく動作します。ただし、ソースにはURIが必要であり、文字列では何もできません

何か案は?

4

0 に答える 0