2008-09-12 41 views
3

我想在WPF中製作一些自定義的MenuHeaders,這樣我就可以在菜單項中顯示(例如)圖標和文本。如何使用加速器在WPF中自定義MenuHeaders?

通常使用MenuItems,如果使用直接文本填充Header字段,則可以使用下劃線添加加速器。例如,_File

但是,如果我想放入一個UserControl,我相信這個函數會中斷,我將如何做類似於下面的事情?

<Menu> 
<MenuItem> 
    <MenuItem.Header> 
    <UserControl> 
     <Image Source="..." /> 
     <Label Text="_Open" /> 
    </UserControl> 
    </MenuItem.Header> 
</MenuItem> 
... 

回答

7

我覺得圖標屬性適合您的需求。
但是,要回答原始問題,可以在撰寫菜單項內容時保留加速器功能。 如果在MenuItem中嵌套了內容,則需要像下面第一個那樣明確定義AccessText屬性。當你使用內聯表單時,這是自動處理的。

<Menu> 
    <MenuItem> 
     <MenuItem.Header> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="Images/Open.ico" />  
      <AccessText>_Open..</AccessText> 
     </StackPanel> 
     </MenuItem.Header> 
    </MenuItem> 
    <MenuItem Header="_Close" /> 
    </Menu> 
+0

這似乎正是我需要的,我可以插入一個切換按鈕堆裏面,而不需要創建的自定義控件添加引腳功能或打破鍵盤使用。謝謝 :) – Nidonocu 2008-09-13 06:53:49

4

問題是你把圖像放在MenuHeader的內容裏,這意味着你會失去加速鍵。如果您只是想在菜單標題中顯示圖片,請執行以下操作。

<MenuItem Header="_Open"> 
    <MenuItem.Icon> 
    <Image Source="images/Open.png"/> 
    </MenuItem.Icon> 
</MenuItem> 

如果你想定製外觀,甚至還覺得,修改controltemplate和風格的菜單。從經驗來看,設計菜單和菜單項的風格要比設計其他WPF控件更困難。

0

@ a7an:啊,我之前沒有注意到Icon屬性。這是一個好的開始。

不過,具體我想一個額外的「按鈕」添加到一些的MenuItems,所以我可以有一個「針」功能(請參閱功能理念在Office 2007中最近被載入的文件列表)。

由於還需要代碼,我是否可能需要繼承控件並添加按鈕的代碼? (不affraid與菜單項模板搞亂的,已經不得不這樣做一次,我會再次這樣做,如果我不得不;!))

2

首先想到,你會認爲Icon屬性只能包含圖像。但它實際上可以包含任何東西!當我以編程方式嘗試將Image屬性直接設置爲具有圖像路徑的字符串時,我意外發現了這一點。結果是它沒有顯示圖像,但是路徑的實際文本!然後我發現我必須先創建一個Image元素並將其設置爲Icon屬性。這使我想到的是,Image屬性是隻是位於圖標區域在菜單左側任意內容容器,我是對的。我試圖在那裏放一個按鈕,它工作!

這顯示了一個按鈕,菜單項的圖標區域中帶有文字「i」。當你點擊按鈕時,Button_Click事件被觸發(當你點擊按鈕時,LanguageMenu_Click不會被觸發)。

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click"> 
    <MenuItem.Icon> 
    <Button Click="Button_Click">i</Button> 
    </MenuItem.Icon> 
</MenuItem> 

這就導致了一個替代不必使圖像的圖標,而是用文字與符號字體,而不是顯示一個簡單的「圖標」。以下示例使用Wingdings字體,其中包含一個floppydisk符號。這個符號在字體映射到charachter <,這在XAML特殊的意義,所以我們必須使用編碼版本&lt;代替。這像夢一樣運作!以下顯示了floppydisk符號作爲菜單項的圖標:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save"> 
    <MenuItem.Icon> 
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
      FontFamily="Wingdings">&lt;</Label> 
    </MenuItem.Icon>     
</MenuItem> 
相關問題