2013-02-20 109 views
14

我想添加單選按鈕到我的菜單項。如何將單選按鈕添加到菜單項?

我已經看到一些答案,人們在做單選按鈕作爲菜單項。但我希望我的菜單項具有可以在Winforms中輕鬆完成的適當單選按鈕。

爲了確保我沒有得到相同答案的其他人,他的菜單項單選按鈕應該是什麼樣子的圖片:

enter image description here

順便說一下,我我正在使用C#,WPF。

+0

你見過這個嗎? http://stackoverflow.com/questions/6253145/how-can-i-create-a-group-of-radio-menu-items-in-wpf – 2013-02-20 12:22:44

+0

@尼爾米切爾:在你需要支持其他主題的情況下如Luna,Aero,Classic等,可能需要爲每種主題風格創建。每個主題都需要這樣做,每個主題都帶有一種風格。它適合你嗎?我的意思是,最好專注於功能和單選按鈕,以至少爲他製作一種通用的風格。然後,如果你需要能夠使它適合你的風格。如果我或其他人會給你一個風格和單選按鈕的解決方案,它會來找你? – 2014-03-08 09:31:08

+0

@AnatoliyNikolaev這個問題只是關於風格 - 寫作功能是相當微不足道的。我想要的是利用主題中已有內容的方式,而不是編寫新的樣式元素。也許是這樣的情況,WPF沒有定義無線菜單按鈕的樣式,或者我可能無法正確地取出樣式。當然,底層操作系統(不是WPF)確實定義了無線電菜單樣式。 – 2014-03-08 22:34:51

回答

15

編輯模板

<Window.Resources>   
    <Style x:Key="{x:Type MenuItem}" TargetType="MenuItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type MenuItem}"> 
        <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
         <Grid VerticalAlignment="Center"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="Auto"/> 
          </Grid.ColumnDefinitions> 
          <ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> 
          <RadioButton Margin="3" IsChecked="{TemplateBinding IsChecked}" VerticalAlignment="Center" x:Name="GlyphPanel" Visibility="Collapsed"/> 
          <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="1" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
          <Popup x:Name="PART_Popup" AllowsTransparency="True" Focusable="False" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom"> 
           <Border x:Name="SubMenuBorder" BorderBrush="#FF999999" BorderThickness="1" Background="#FFF0F0F0" Padding="2"> 
            <ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"> 
             <Grid RenderOptions.ClearTypeHint="Enabled"> 
              <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0"> 
               <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=SubMenuBorder}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/> 
              </Canvas> 
              <Rectangle Fill="#FFD7D7D7" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1"/> 
              <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/> 
             </Grid> 
            </ScrollViewer> 
           </Border> 
          </Popup> 
         </Grid> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSuspendingPopupAnimation" Value="True"> 
          <Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/> 
         </Trigger> 
         <Trigger Property="Icon" Value="{x:Null}"> 
          <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
         </Trigger> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> 
          <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
         </Trigger> 
         <Trigger Property="IsHighlighted" Value="True"> 
          <Setter Property="Background" TargetName="templateRoot" Value="#3D26A0DA"/> 
          <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF26A0DA"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="False"> 
          <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="#FF707070"/> 
          <Setter Property="Visibility" TargetName="GlyphPanel" Value="Collapsed"/> 
         </Trigger> 
         <Trigger Property="CanContentScroll" SourceName="SubMenuScrollViewer" Value="False"> 
          <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/> 
          <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 

      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style x:Key="ItemcontainerStyle" TargetType="MenuItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type MenuItem}"> 
        <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
         <Grid Margin="-1"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition MinWidth="22" SharedSizeGroup="MenuItemIconColumnGroup" Width="Auto"/> 
           <ColumnDefinition Width="13"/> 
           <ColumnDefinition Width="*"/> 
           <ColumnDefinition Width="30"/> 
           <ColumnDefinition SharedSizeGroup="MenuItemIGTColumnGroup" Width="Auto"/> 
           <ColumnDefinition Width="20"/> 
          </Grid.ColumnDefinitions> 
          <ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> 
          <Border x:Name="GlyphPanel" BorderBrush="#FF26A0DA" BorderThickness="1" Background="#3D26A0DA" ClipToBounds="False" HorizontalAlignment="Center" Height="22" Margin="-1,0,0,0" Visibility="Hidden" VerticalAlignment="Center" Width="22"> 
           <RadioButton x:Name="Glyph" IsChecked="{TemplateBinding IsChecked}" GroupName="a" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
          </Border> 
          <ContentPresenter x:Name="menuHeaderContainer" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="2" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/> 
          <TextBlock x:Name="menuGestureText" Grid.Column="4" Margin="{TemplateBinding Padding}" Opacity="0.7" Text="{TemplateBinding InputGestureText}" VerticalAlignment="Center"/> 
         </Grid> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="Icon" Value="{x:Null}"> 
          <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
         </Trigger> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> 
          <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
         </Trigger> 
         <Trigger SourceName="Glyph" Property="IsChecked" Value="False"> 
          <Setter Property="Visibility" TargetName="GlyphPanel" Value="Hidden"/> 
          <Setter Property="Visibility" TargetName="Glyph" Value="Collapsed"/> 
         </Trigger> 
         <Trigger Property="IsHighlighted" Value="True"> 
          <Setter Property="Background" TargetName="templateRoot" Value="#3D26A0DA"/> 
          <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF26A0DA"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="False"> 
          <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="#FF707070"/> 
         </Trigger> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsHighlighted" Value="True"/> 
           <Condition Property="IsEnabled" Value="False"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="Background" TargetName="templateRoot" Value="#0A000000"/> 
          <Setter Property="BorderBrush" TargetName="templateRoot" Value="#21000000"/> 
         </MultiTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

MainWindow.xaml:

<Menu> 
     <MenuItem Header="File" ItemContainerStyle="{StaticResource ItemcontainerStyle}"> 
      <MenuItem IsCheckable="True" Header="Example Menu Item"/> 
      <MenuItem IsCheckable="True" Header="Example Menu Item"/> 
     </MenuItem> 
    </Menu> 

的App.xaml

<Application x:Class="MenuItemTemplate.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources>   
    <!--Luna--> 
    <ResourceDictionary Source="/PresentationFramework.Luna, Version=3.0.0.0, 
    Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
    ProcessorArchitecture=MSIL;component/themes/luna.normalcolor.xaml" /> 

    <!--Aero--> 
    <!--<ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml"/>--> 

    <!--Classic--> 
    <!--<ResourceDictionary Source="/PresentationFramework.Classic, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/classic.xaml" />--> 
</Application.Resources> 

輸出

enter image description here

+0

你在哪裏學習wpf。我想了解它。 – Vishal 2014-03-11 12:33:57

+0

來自stackoverflow和msdn。 – 2014-03-11 13:08:58

+0

感謝您的信息。 – Vishal 2014-03-11 14:05:31

2

你可以通過改變它的模板的屬性更改控件的外觀:

  <MenuItem> 
       <MenuItem.Template> 
        <ControlTemplate> 
         <RadioButton>Radio</RadioButton> 
        </ControlTemplate> 
       </MenuItem.Template> 
      </MenuItem> 

編輯:使用單選按鈕爲菜單項圖標,以獲得其在圖中所示的樣子:

   <MenuItem Header="Hallo"> 
        <MenuItem.Icon> 
         <RadioButton/> 
        </MenuItem.Icon> 
       </MenuItem> 
+0

我已經習慣了你的代碼,但它正在製作一個單選按鈕,而不是在菜單項的文本右側放置一個帶圓圈的方框。你可以給我一些代碼,這將使廣場上的一個圓圈相同的單選按鈕,如我的照片所示? – Bubbled86 2013-02-21 01:33:47

相關問題