2010-07-15 34 views
7

Me gustaría tener barras de herramientas personalizables en mi aplicación, como las que ofrece Visual Studio 2008 (haga clic con el botón secundario en la barra de herramientas, personalice). Necesito una solución WPF, y no he podido encontrar ninguna (ni en SO ni en Google). Encontré esto Visual Studio 2010 blog entry, lo que implica que incluso Microsoft tuvo algunos problemas para hacerlo. De todos modos, para mantenerlo simple, la pregunta es, ¿existe algún marco de código abierto/libre que proporcione esta funcionalidad (no tiene que ser una réplica exacta de la solución de VS2008).Barra de herramientas personalizable en WPF

+0

¿Es tu pregunta acerca de cómo agregar un menú contextual de la bandeja de la barra de herramientas o estás queriendo saber cómo agregar dinámicamente iconos y comandos la barra de herramientas basada en las preferencias del usuario? –

+0

El segundo, y no estoy realmente interesado en implementarlo desde cero, que sé cómo hacerlo, estoy más interesado en algún tipo de marco que me ahorraría algo/la mayoría del trabajo. – Ivan

Respuesta

3

Acabo de jugar un poco y creo que debería ser relativamente fácil implementar el comportamiento deseado solo con WPF (no se necesita una biblioteca o marco adicional). Incluí código de ejemplo para agregar un Button a un ToolBar que a su vez permite agregar más botones a la barra de herramientas.

Para obtener el comportamiento deseado, tengo una colección de botones para la barra de herramientas y otra colección con botones disponibles. Las barras de herramientas ItemsSource se vincularán a la primera colección. Después de hacer clic en el botón "personalizar" en el menú contextual, mostraría otro formulario con dos ListViews (cada uno vinculado a una de las colecciones) y botones para agregar/eliminar los botones de la colección completa a/desde la colección de barras de herramientas. HTH.

Código:

public ObservableCollection<Button> Buttons { get; set; } 

public MainWindow() 
{ 
    InitializeComponent(); 

    Buttons = new ObservableCollection<Button>(); 
    AddButton(); 

    DataContext = this; 
} 

private void ButtonAddButton_Click(object sender, RoutedEventArgs e) 
{ 
    AddButton(); 
} 

private void AddButton() 
{ 
    var button = new Button(); 
    button.Content = "Add Button (" + Buttons.Count + ")"; 
    button.Click += ButtonAddButton_Click; 
    Buttons.Add(button); 
} 

XAML:

<Grid> 
    <ToolBarTray> 
     <ToolBar ItemsSource="{Binding Buttons}"> 
      <ToolBar.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Customize" /> 
       </ContextMenu> 
      </ToolBar.ContextMenu> 
     </ToolBar> 
    </ToolBarTray> 
</Grid> 
+1

Esta es una respuesta excelente. –

1

Dado que una ToolBar es un ItemsControl, puede intentar usar los frameworks de arrastrar y soltar para lograr lo que desea.

http://bea.stollnitz.com/blog/?p=53

Esta es una gran solución para el manejo de los elementos enlazados a datos. Necesitará personalizar el código un poco si no está utilizando el enlace de datos para mostrar sus elementos de ToolBar (aunque sugiero que use el enlace de datos, esto hará que guardar las personalizaciones sea mucho más simple).

Al presionar "personalizar" en su aplicación, puede abrir un ListBox con los elementos disponibles (debe estar en la misma ventana para que funcione la solución anterior) y activar y quitar desde/a ToolBars y ListBox usando la propiedad adjunta.

Cuestiones relacionadas