2010-05-31 6 views
0

J'ai beaucoup de MenuItem (s), et je veux être en mesure de changer leur "Contenu" afin qu'il affiche dans le programme. Quand je charge le programme, leur "Content Name" est défini dans un Setter que j'ai créé .. mais le seul problème est que j'ai près d'une centaine d'objets MenuItem, et j'ai besoin de leurs noms d'affichage dans le programme pour être différent la valeur par défaut du setter). Je pourrais juste créer plus de 100 "Setter" différents et changer une ligne en eux .. mais cela prend beaucoup de temps. Y a-t-il une approche plus simple? Je veux être en mesure de le faire dans le XAML où je les déclare. Y a-t-il un moyen de faire cela? J'ai cherché et essayé différentes tentatives, mais rien jusqu'ici .. peut-être quelqu'un sait?WPF MenuItem Contenu "Nom"

EDIT:

Désolé, peut-être que je suis un peu clair ..

Je l'ai déjà créé les MenuItems et ils sont basés sur le Setter que j'ai créé ... Le problème est .. Je veux maintenant que chacun soit encore basé sur ce Setter, mais pour avoir un "Content"/Name unique qui s'affiche pour l'utilisateur ... Actuellement, ils ont tous le nom "Content" qui leur a été donné par le setter, mais je Je cherche un moyen de définir le nom de contenu de chaque MenuItem à travers XAML .. est-ce possible?

Merci

Répondre

0

Votre question n'est pas claire. Je pense que la meilleure façon de créer des centaines d'éléments de menu est de les créer à partir du code qui n'est pas en XAML. par exemple dans une boucle foreach. alors vous pouvez donner à chacun d'eux un nom unique et significatif. Veuillez décrire votre problème plus clairement.

merci

+0

Désolé, je suis peut-être un peu confus .. J'ai déjà créé les MenuItems et ils sont basés sur le Setter que j'ai créé ... Le problème est .. Je veux maintenant que chacun soit encore basé sur ce Setter, mais pour avoir un "Content"/Nom unique qui s'affiche pour l'utilisateur ... Actuellement, ils ont tous le nom "Content" qui leur a été donné par le setter, mais je cherche un moyen de configurer chaque MenuItem nom du contenu via XAML .. est-ce possible? – Kyle

0

Maintenant, je comprends votre problème. Généralement je pense que ce serait une très mauvaise idée de définir la propriété de contenu pour chacun de vos menusItems dans le fichier XAML. Spécialement quand vous traitez avec des centaines d'articles. Une meilleure façon est d'utiliser la fonctionnalité de liaison de données de WPF et DataTemplates, pas de coder en dur les noms de menuItem dans le fichier XAML. Je vais propulser deux solutions pour votre problème. La première solution utilise l'approche code-behind pour créer des éléments de menu, puis les lier à la propriété ItemsSource de MainMenu sans utiliser dataTemplates. le code suivant est le code-behind code pour la fenêtre:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MenuItems = new ObservableCollection<MenuItem>(); 

     for (int i = 0; i < 40; i++) 
     { 
      MenuItem menuItem = new MenuItem(); 
      menuItem.Header = "MenuItem" + i.ToString(); 
      MenuItems.Add(menuItem); 
     } 

     MainMenu.DataContext = this; 
    } 

    public ObservableCollection<MenuItem> MenuItems 
    { 
     get; 
     set; 
    } 
} 

dans ce premier code que nous avons créé 40 nombre de menuItems puis nous les lier à la propriété DataContext de l'objet MainMenu. le code suivant montre le code XAML des fenêtres dont il est l'objet MainMenu:

<Window x:Class="WpfApplication17.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" > 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}"> 

     </Menu> 
    </Grid> 
</Window> 

dans ce approch vous pouvez d'abord créer tous vos éléments de menu et leurs noms dans le code et après qui les lient à l'objet Menu. Vous pouvez ensuite utiliser des styles pour définir les propriétés communes des éléments de menu.

mais une meilleure solution consiste à utiliser dataTemplates comme je l'ai fait dans le code suivant. Dans cette approche, vous avez d'abord créé une classe pour stocker les noms de vos éléments de menu. puis, à l'aide de la fonction de modèle de données de WPF, vous pouvez les lier à vos éléments MainMenu. le code-behind de cette solution est la suivante:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MenuItems = new ObservableCollection<CustomMenuItem>(); 

     MenuItems.Add(new CustomMenuItem("Item 1")); 
     MenuItems.Add(new CustomMenuItem("Item 2")); 
     MenuItems.Add(new CustomMenuItem("Item 3")); 

     MainMenu.DataContext = this; 
    } 

    public ObservableCollection<CustomMenuItem> MenuItems 
    { 
     get; 
     set; 
    } 
} 

public class CustomMenuItem 
{ 
    public string Name { get; set; } 

    public CustomMenuItem(string name) 
    { 
     Name = name; 
    } 
} 

dans ce code je la classe CustomMenuItem pour stocker les noms MenuItem. le constructeur MainWindows est disponible pour créer les menuitems mais vous pouvez les récupérer à partir d'autres sources, comme un fichier XML de base de données.le code XAML pour la MainWindow est comme ceci:

<Window x:Class="WpfApplication17.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication17" 
     Title="MainWindow" Height="350" Width="525" > 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:CustomMenuItem}"> 
      <TextBlock Text="{Binding Name}"></TextBlock> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}"> 

     </Menu> 
    </Grid> 
</Window> 

cette façon, vous pouvez récupérer vos noms menuitem fot exemple \ r à partir d'un fichier XML ou d'autres sources de données et ils ne sont pas hardcoded dans votre fichier XAML. Vous pouvez ensuite utiliser les fonctionnalités puissantes de DataTemplates pour afficher vos éléments de menu comme vous le souhaitez.

Questions connexes