2011-12-07 69 views

回答

2

我使用這個類,它看上去很不錯: http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html

我會在這裏發表所以它的清潔閱讀:

/// <summary> 
/// Andy On WPF: DropDownButtons in WPF 
/// http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html 
/// </summary> 
public class DropDownButton : ToggleButton 
{ 
    #region Members 

    public enum Placement { Bottom, Right } 

    #endregion 

    #region Properties 

    #region DropDownPlacement 

    /// <summary> 
    /// DropDown placement. 
    /// </summary> 
    public Placement DropDownPlacement 
    { 
     get { return (Placement)GetValue(DropDownPlacementProperty); } 
     set { SetValue(DropDownPlacementProperty, value); } 
    } 

    /// <summary> 
    /// DropDown placement (Dependency Property). 
    /// </summary> 
    public static readonly DependencyProperty DropDownPlacementProperty = 
     DependencyProperty.Register("DropDownPlacement", typeof(Placement), 
     typeof(DropDownButton), new UIPropertyMetadata(null)); 

    #endregion 

    #region DropDown 

    /// <summary> 
    /// DropDown property. 
    /// </summary> 
    public ContextMenu DropDown 
    { 
     get { return (ContextMenu)GetValue(DropDownProperty); } 
     set { SetValue(DropDownProperty, value); } 
    } 

    /// <summary> 
    /// DropDown property (Dependency property). 
    /// </summary> 
    public static readonly DependencyProperty DropDownProperty = 
     DependencyProperty.Register("DropDown", typeof(ContextMenu), 
     typeof(DropDownButton), new PropertyMetadata(null, OnDropDownChanged)); 

    #endregion 

    #endregion 

    #region Events 

    private static void OnDropDownChanged(DependencyObject sender, 
     DependencyPropertyChangedEventArgs e) 
    { 
     ((DropDownButton)sender).OnDropDownChanged(e); 
    } 

    void OnDropDownChanged(DependencyPropertyChangedEventArgs e) 
    { 
     if (DropDown != null) 
     { 
      DropDown.PlacementTarget = this; 

      switch (DropDownPlacement) 
      { 
       default: 
       case Placement.Bottom: 
        DropDown.Placement = PlacementMode.Bottom; 
        break; 
       case Placement.Right: 
        DropDown.Placement = PlacementMode.Right; 
        break; 
      } 

      this.Checked += 
       new RoutedEventHandler((a, b) => { DropDown.IsOpen = true; }); 
      this.Unchecked += 
       new RoutedEventHandler((a, b) => { DropDown.IsOpen = false; }); 
      DropDown.Closed += 
       new RoutedEventHandler((a, b) => { this.IsChecked = false; }); 
     } 
    } 

    #endregion 
} 
+0

我認爲這是做這件事最體面的方法。謝謝 :) –

1

它有一個自定義control template,似乎有一個透明的背景,除非在鼠標懸停,當然梯度和邊界也不同。

在MSDN上有一個自定義模板an example,這個模板導致了一個相當藍色的按鈕,基本上你可以對模板做任何事情,但是它們的創建可能還是一些工作。 Expression Blend可以有助於控制模板。

+0

是的,我知道已經知道這是一個控制模板,但是你有什麼想法ControlElemets將在這裏使用:) –

+0

它可能是各種控件,我認爲[默認模板](http ://stackoverflow.com/questions/1559261/control-template-for-existing-controls-in-wpf)的按鈕可能是一個很好的開始基本的外觀,但你可能想模板一個'菜單'和' MenuItem'因爲功能。如果你有一些想法如何創建一個包含狀態,PART等知識的模板,那麼你應該能夠重新創建這個模板,這不像你需要保持對Windows中使用的實際內部的真實性。 –

+0

你有一個點在那裏:),以我自己的方式重新創建這個模板將滿足這個問題。但我仍然很好奇這裏的微軟人會使用什麼。無論如何感謝你+1 –

1

要獲得下拉菜單的部分內容,您可以設置按鈕的ContextMenu屬性,然後使用ContextMenu.Placement將其正確放置在按鈕下方。

您可能還必須設置ContextMenu.PlacementTarget以保持它相對於按鈕。

+0

嗯..這也是一個好主意,也許路由事件可能有助於通過這種方法..謝謝+1給你 –

+1

你可以實現按鈕的Click事件,讓菜單下拉點擊鼠標左鍵。 – JayP

+0

我不知道這一點,它在概念上是一個菜單,按鈕是頂級菜單項,只是看起來有點不同,我不會彎曲按鈕來提供它不適用的功能。 –

1

對不起再次增加,但我只是意識到這種控制也存在在Codeplex上的擴展WPF工具包:

http://wpftoolkit.codeplex.com/wikipage?title=DropDownButton

它實現像這(根據他們的網站):

<extToolkit:DropDownButton Content="Click Me" Margin="15" > 
    <extToolkit:DropDownButton.DropDownContent> 
     <extToolkit:ColorCanvas /> 
    </extToolkit:DropDownButton.DropDownContent> 
</extToolkit:DropDownButton> 

你可以在那裏根據需要添加MenuItems。

我已經使用這個工具包的其他功能(ChildWindow和SplitButton),我認爲它做得很好。隨着人們繼續在WPF中請求更多的Office 2007/2010功能,請繼續期待CodePlex和Microsoft更像這樣。