WPF橫向導航菜單


一、序言

    記得沒出來工作就開始逛博客園了,這個博客網站做的很好,有很多大神都在里面,當然也有了優質的技術文章,好了,言歸正傳。這篇博文講的是做一個橫向導航菜單,畢竟菜單是常用的,要多練習練習,就仿照博客園個人博客主頁的菜單做一個。

二、該菜單使用Menu控件 

   1、前端xmal代碼如下

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Menu>
            <MenuItem Header="首頁"/>
            <MenuItem Header="新隨筆"/>
            <MenuItem Header="聯系"/>
            <MenuItem Header="訂閱"/>
            <MenuItem Header="管理"/>
        </Menu>
    </Grid>
</Window>

 2、運行起來看下效果圖

 3、基本功能做完了就要實現以下效果提升用戶體驗了,現在要把鼠標移到菜單項上背景色變為藍色,下面是xmal代碼:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Menu>
            <MenuItem Header="首頁">
                <MenuItem.Template>
                    <ControlTemplate TargetType="MenuItem">
                        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="首頁" Background="LightGray"></TextBlock>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
            <MenuItem Header="新隨筆">
                <MenuItem.Template>
                    <ControlTemplate TargetType="MenuItem">
                        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="新隨筆" Background="LightGray"></TextBlock>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
            <MenuItem Header="聯系">
                <MenuItem.Template>
                    <ControlTemplate TargetType="MenuItem">
                        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="聯系" Background="LightGray"></TextBlock>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
            <MenuItem Header="訂閱">
                <MenuItem.Template>
                    <ControlTemplate TargetType="MenuItem">
                        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="訂閱" Background="LightGray"></TextBlock>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
            <MenuItem Header="管理">
                <MenuItem.Template>
                    <ControlTemplate TargetType="MenuItem">
                        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="管理" Background="LightGray"></TextBlock>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
        </Menu>
    </Grid>
</Window>

3.1、上面每個菜單項都用了重復模板,有點雞肋,現在要把這個模板抽象出來


   3.1.1、創建資源字典

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfApp1.Dictionary">
    <ControlTemplate x:Key="MenuItemTemplate" TargetType="MenuItem">
        <TextBlock x:Name="txt" Padding="2,2,2,2" Text="首頁"  Background="LightGray"></TextBlock>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="txt" Property="Background" Value="Blue"></Setter>
                <Setter TargetName="txt" Property="Padding" Value="2,2,2,2"></Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</ResourceDictionary>

   3.1.2、集成資源字典

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary\DictionaryMenu.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

   3.1.3、使用資源字典

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Menu>
            <MenuItem Header="首頁" Name="ddd" Template="{StaticResource MenuItemTemplate}">
            </MenuItem>
            <MenuItem Header="新隨筆" Name="ddd1" Template="{StaticResource MenuItemTemplate}">
            </MenuItem>
            <MenuItem Header="聯系" Name="ddd2"  Template="{StaticResource MenuItemTemplate}">
            </MenuItem>
            <MenuItem Header="訂閱" Name="ddd4" Template="{StaticResource MenuItemTemplate}">
            </MenuItem>
            <MenuItem Header="管理" Name="ddd5" Template="{StaticResource MenuItemTemplate}">
            </MenuItem>
        </Menu>
    </Grid>
</Window>

   3.1.4、運行效果圖,上面的資源字典控件模板里面Text的值如何動態綁定?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM