2009-10-19 4 views
5

J'ai une fenêtre WPF qui a un ToolBar. J'ai une collection d'objets dans ma machine virtuelle à laquelle je suis lié. Ils apparaissent sous la forme de boutons mais ils sont toujours poussés vers la partie déroulante déroulée du ToolBar. Comment puis-je faire apparaître ces boutons dans la partie standard du ToolBar?Comment obtenir une barre d'outils WPF à lier à une collection dans ma machine virtuelle sans utiliser d'extension

je le XAML suivant:

<ToolBarTray Grid.Row="1"> 
    <ToolBar ItemsSource="{Binding Path=MyList}" > 
     <ToolBar.ItemTemplate> 
      <DataTemplate > 
       <Button ToolTip="{Binding ButtonName}" 
         Command="{Binding Path=ButtonCommand}" > 
        <Button.Content> 
         <Image Width="32" Height="32" Source="{Binding ImageSource}"/> 
        </Button.Content> 
       </Button> 
      </DataTemplate> 
     </ToolBar.ItemTemplate> 
    </ToolBar> 
</ToolBarTray> 

je suivantes C#:

public List<MyClass> MyList 
    { 
     get 
     { 
      return new List<MyClass> 
         { 
          new MyClass{ButtonName="Button1",[email protected]"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"}, 
          new MyClass{ButtonName="Button2",[email protected]"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"}, 
          new MyClass{ButtonName="Button3",[email protected]"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"}, 
          new MyClass{ButtonName="Button4",[email protected]"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"}, 
         }; 

     } 
    } 

Ceci est le résultat visuel:

alt text

+0

Si je donne à la barre d'outils la largeur statique de 500, le même résultat visuel se produit –

+0

Pouvez-vous s'il vous plaît être plus précis – Shimmy

+0

@Shimmy, je ne pense pas que je puisse être plus précis mais je vais essayer. Je veux que les boutons que j'ai dans ma barre d'outils apparaissent dans la partie standard (non débordée) de la barre d'outils –

Répondre

4

Il y a un bogue dans la barre d'outils, si vous redimensionnez la fenêtre, le problème disparaît.

La solution utilise un autre contrôle, comme:

public class WorkaroundToolBar : ToolBar 
{ 
    private delegate void IvalidateMeasureJob(); 

    public override void OnApplyTemplate() 
    { 
     Dispatcher.BeginInvoke(new IvalidateMeasureJob(InvalidateMeasure), 
            DispatcherPriority.Background, null); 
     base.OnApplyTemplate(); 
    } 
} 

Découvrez this thread pour plus d'infos

+0

Malheureusement, cela n'a pas fonctionné. Vous avez raison, quand je redimensionne l'écran, les boutons apparaissent comme prévu. –

+0

Fonctionne dans ma machine, essayez cet exemple barebones que j'ai fait http://www.bizcacha.com/public/WpfApplication3.rar –

+0

Cette solution n'a pas fonctionné directement pour moi non plus. Je n'ai pas vérifié votre échantillon fourni cependant. – Oskar

1

Vous pouvez également définir la hauteur de la barre d'outils dans le XAML à une valeur raisonnable qui a travaillé pour moi.

1

Pour ajouter à Eduardo de, je devais modifier légèrement ce depuis ma source d'élément a été obtenir peuplé de manière asynchrone, un certain temps après l'interface utilisateur initiale est affichée:

public class ToolBar : System.Windows.Controls.ToolBar 
{ 
    public override void OnApplyTemplate() 
    { 
     Dispatcher.BeginInvoke ((Action)(InvalidateMeasure), DispatcherPriority.Background, null); 
     base.OnApplyTemplate(); 
    } 
    protected override void OnItemsChanged (NotifyCollectionChangedEventArgs e) 
    { 
     base.OnItemsChanged (e); 
     Dispatcher.BeginInvoke ((Action)(InvalidateMeasure), DispatcherPriority.Background, null); 
    } 
} 

Ce fut assez pour attraper tous les cas de pointe et ont le débordement se produit correctement au besoin après la population des articles.

Questions connexes