<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<ToggleButton x:Name="menuButton" Content="{Binding DisplayText}" Style="{StaticResource TopMenuButton}" IsChecked="{Binding ElementName = menuPopup, Path=IsOpen, Mode=TwoWay}"/>
</StackPanel>
<local:MenuPopup x:Name="menuPopup" Width="{Binding ActualWidth,ElementName=menuButton}" IsOpen="{Binding ElementName=menuButton,Path=IsChecked, Mode=OneWay}"
PlacementTarget="{Binding ElementName=menuButton}" StaysOpen="False" 
PopupMenuItemClicked="menuPopup_PopupMenuItemClicked"/>
</Grid>

MenuButton样式

 

<Style TargetType="ToggleButton" x:Key="TopMenuButton">
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Height" Value="50"/>
        <Setter Property="Width" Value="180"/>
        <Setter Property="Background" Value="#FF304156"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                        <TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="Background" Value="#FF2B3A4D"/>
                            <Setter Property="Cursor" Value="Hand"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="border" Property="Background" Value="#FF2B3A4D"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ToggleButton样式

<Grid>
        <ListBox x:Name="listBox" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" Background="{StaticResource MenuPopupBackgroud}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="OverridesDefaultStyle" Value="True" />
                    <Setter Property="SnapsToDevicePixels" Value="True" />
                    <Setter Property="BorderThickness" Value="0.5"/>
                    <Setter Property="BorderBrush" Value="LightGray"/>
                    <Setter Property="Height" Value="35"/>
                    <Setter Property="Foreground" Value="White"/>
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_MouseLeftButtonDown"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <Border x:Name="border" CornerRadius="0" >
                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Center" Margin="10,0,0,0" />
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter Property="Foreground" Value="White" />
                                        <Setter TargetName="border" Property="Background" Value="{StaticResource MenuPopupBackgroud}" />
                                    </Trigger>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter TargetName="border" Property="Background" Value="{StaticResource MenuPopuoMouseMove}" />
                                        <Setter Property="Cursor" Value="Hand"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>

            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>

MenuPopup Xaml

public partial class MenuPopup : Popup, INotifyPropertyChanged
    {
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PopupMenuItemsProperty = DependencyProperty.Register("PopupMenuItems", typeof(IEnumerable<string>), typeof(MenuPopup), new PropertyMetadata(new PropertyChangedCallback(OnPopupMenuItemsChanged)));

        private static void OnPopupMenuItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = d as MenuPopup;
            control.SetListBoxItems();
        }

        public IEnumerable<string> PopupMenuItems
        {
            get { return (IEnumerable<string>)GetValue(PopupMenuItemsProperty); }
            set { SetValue(PopupMenuItemsProperty, value); }
        }

        public event EventHandler<string> PopupMenuItemClicked;


        public MenuPopup()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        private void SetListBoxItems()
        {
            listBox.ItemsSource = PopupMenuItems;
        }

        private void ListBoxItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.IsOpen = false;
            var item = sender as ListBoxItem;
            if (item == null)
                return;
            if (PopupMenuItemClicked != null)
                PopupMenuItemClicked(this, item.Content.ToString());
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if(this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        private int _selectedIndex;
        public int SelectedIndex
        {
            get { return _selectedIndex; }
            set
            {
                _selectedIndex = value;
                OnPropertyChanged("SelectedIndex");
            }
        }
    }

Menupopup cs 文件