2013-02-20 28 views
14

Tôi muốn thêm các nút radio vào các mục menu của mình.Làm cách nào để bạn thêm nút radio vào các mục menu?

Tôi đã thấy một vài câu trả lời mà mọi người đang tạo nút radio làm các mục menu. Nhưng tôi muốn các mục menu của tôi có nút radio thích hợp có thể dễ dàng thực hiện trong Winforms.

Để chắc chắn rằng tôi không nhận được câu trả lời tương tự như những người khác, ông là một bức tranh về những gì các nút radio các mục trình đơn sẽ giống như thế:

enter image description here

Và bằng cách này, tôi đang sử dụng C#, WPF.

+0

Bạn đã thấy điều này chưa? http://stackoverflow.com/questions/6253145/how-can-i-create-a-group-of-radio-menu-items-in-wpf –

+0

@Neil Mitchell: Trong trường hợp bạn cần hỗ trợ các chủ đề khác chẳng hạn như Luna, Aero, Classic vv, có thể sẽ cần phải được tạo cho mỗi kiểu chủ đề. Điều đó là cần thiết cho mỗi chủ đề mang theo nó một phong cách cho mỗi chủ đề. Điều đó có phù hợp với bạn không? Ý tôi là, tốt hơn là nên tập trung vào các chức năng và nút radio để tạo ra ít nhất một phong cách chung cho anh ấy. Sau đó, nếu bạn cần để có thể làm cho nó phù hợp với phong cách của bạn. Nếu tôi hoặc bất cứ ai khác sẽ cung cấp cho bạn một giải pháp cho một phong cách và nút radio, nó sẽ đến với bạn? –

+0

@AnatoliyNikolaev Câu hỏi này chỉ là về phong cách - viết các chức năng là khá tầm thường. Và những gì tôi muốn là một cách để tận dụng những gì đã có trong các chủ đề, không viết các yếu tố phong cách mới. Có lẽ nó là trường hợp mà WPF không xác định phong cách cho các nút menu radio, hoặc có lẽ tôi chỉ không thể có được phong cách ra đúng cách. Chắc chắn hệ điều hành bên dưới (không phải WPF) định nghĩa các kiểu menu radio. –

Trả lời

15

Edited Template

<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> 

Output

enter image description here

+0

bạn đã học wpf ở đâu. Tôi muốn học nó. – Vishal

+0

Từ stackoverflow và msdn. –

+0

Cảm ơn, vì thông tin. – Vishal

2

Bạn có thể thay đổi giao diện của một Control bằng cách thay đổi nó Template-bất động sản:

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

EDIT: Sử dụng một RadioButton như MenuItem-Biểu tượng, để có được cái nhìn đó được thể hiện trong hình:

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

Tôi đã sử dụng để mã mà bạn có, nhưng nó đang làm cho một nút radio thay vì có hộp vuông với một vòng tròn trong nó, ở bên phải của văn bản của mục trình đơn. Bạn có thể vui lòng cung cấp cho một số mã sẽ làm cho cùng một nút radio với một vòng tròn trong hình vuông, như thể hiện trong hình ảnh của tôi? – Bubbled86

Các vấn đề liên quan