LoginSignup
2
5

More than 3 years have passed since last update.

[WPF, XAML] TabControl でWebっぽいメニューをつくる

Posted at

Webとかでよく見るありがちなメニューをTabItemをできるだけシンプルにカスタマイズして再現してみました。
完成形↓
menu.png
まずはTabItemのスタイルを設定します。

TabControlMenu.xaml
<Style x:Key="Menu" TargetType="TabItem">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="TabItem">
        <Border Name="Border" CornerRadius="0" Margin="0" Padding="8,3,0,3" BorderThickness="0" Background="Transparent" Width="160">
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="5"/>
              <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBlock Name="TextBlock" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0" FontSize="18" FontFamily="Yu Gothic" Foreground="white" Grid.Column="1" FontWeight="Bold">
              <ContentPresenter ContentSource="Header"/>
            </TextBlock>
          </Grid>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="True">
            <Setter TargetName="Border" Property="Background" Value="#555"/>
            <Setter TargetName="Border" Property="BorderThickness" Value="0,0,2,0"/>
            <Setter TargetName="Border" Property="BorderBrush" Value="#cd3f37"/>
            <Setter TargetName="TextBlock" Property="Foreground" Value="#cd3f37"/>
            <Setter TargetName="Border" Property="Opacity" Value="0.9"/>
          </Trigger>
          <Trigger Property="IsSelected" Value="False">
            <Setter TargetName="Border" Property="Background" Value="transparent"/>
            <Setter TargetName="TextBlock" Property="Foreground" Value="#ccc"/>
            <Setter TargetName="Border" Property="BorderThickness" Value="0,0,0,0"/>
            <Setter TargetName="Border" Property="Opacity" Value="0.8"/>
          </Trigger>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="Border" Property="Cursor" Value="Hand"/>
            <Setter TargetName="Border" Property="Background" Value="#555"/>
            <Setter TargetName="Border" Property="Opacity" Value="1.0"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

つぎに本体部分。メニューの背景はBorderで作成し、その上にTabControlを置いています。
ダミーのタブを入れてスペースを作ってます。

TabControlMenu.xaml
<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="161"/>
    <ColumnDefinition />
  </Grid.ColumnDefinitions>
  <Border Background="#333" BorderThickness="0,0,1,0" BorderBrush="#e8e8e8"/>
  <TabControl TabStripPlacement="Left" BorderThickness="0" Grid.ColumnSpan="2">
    <TabItem Style="{StaticResource Menu}" IsEnabled="False" Height="5"/>
    <TabItem Style="{StaticResource Menu}" IsSelected="True" Header="本日のおすすめ"/>
    <TabItem Style="{StaticResource Menu}" Header="おつまみ"/>
    <TabItem Style="{StaticResource Menu}" Header="魚"/>
    <TabItem Style="{StaticResource Menu}" Header="肉"/>
    <TabItem Style="{StaticResource Menu}" Header="飯・麺"/>
    <TabItem Style="{StaticResource Menu}" Header="ドリンク"/>
    <TabItem Style="{StaticResource Menu}" IsEnabled="False" Height="20"/>
    <TabItem Style="{StaticResource Menu}" Header="注文履歴"/>
  </TabControl>
</Grid>

こんな感じ。ね、簡単でしょ?
アイコンを付け加えると更にそれらしさが増します。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5