2011-02-12 29 views
15

En mi aplicación basada en WPF4 Desktop hay un gran bloque con menú en la barra lateral que se repite en cada ventana y toma alrededor de 70 líneas de XAML. Con el fin de mejorar la reutilización de código, me gustaría dividir el archivo XAML en dos archivos:Dividir un XAML grande en cantidad de archivos Sub-XAML

  1. XAML-archivo que contiene el código para el menú de la barra lateral (≈ 70 líneas) archivo XAML
  2. Base que contiene «include/referencia »a XAML-archivo con código de menú de la barra lateral

Según entendí, hay dos maneras de implementar mi problema:

  1. uso ResourceDictionary
  2. Uso control de usuario/CustomControl

Mis preguntas son:

  1. ¿Cuál es la diferencia entre ResourceDictionary y control de usuario? ¿Podría darme ejemplos donde tengo que usar UserControl y donde ResourceDictionary?

  2. ¿Podría dar un ejemplo completo de código sobre cómo incluir/importar el contenido de un archivo XAML a otro?

P.S. Aquí está un ejemplo de código que quiero exportar a separada XAML-archivo:

<Border Style="{StaticResource Body_SideBarMenu_Border_Settings}"> 
    <StackPanel Style="{StaticResource Body_SideBarMenu}"> 

    <TextBlock Style="{StaticResource Body_SideBarMenu_Title}" 
      Text="{x:Static res:Resources.WinApp_SideBarMenu_Title}" /> 

     <TextBlock x:Name="SideBar_WinReports" 
       Style="{StaticResource Body_SideBarMenu_Item}" 
       Text="{x:Static res:Resources.DashListMarker}"> 
        <Hyperlink KeyboardNavigation.TabIndex="12" 
          Style="{StaticResource Body_SideBarMenu_Item_Hyperlink}" 
          Click="Call_WinReports_Click"> 
          <TextBlock Text="{x:Static res:Resources.WinApp_ModuleName_Reports}" /> 
        </Hyperlink> 
     </TextBlock> 

    </StackPanel> 
</Border> 

Respuesta

13

ResourceDictionary es sólo un contenedor para sus estilos/plantillas etc. Por lo que realmente tiene que elegir entre el uso de un estilo (y referencia a ella a través de un ResourceDictionary) o un UserControl.

Para diferenciar entre los dos, hágase una pregunta: ¿está implementando simplemente otro aspecto para algún control existente, o está implementando algo realmente nuevo, que es más que un ListView (o un borde, o un ComboBox, etc.)? En el primer caso, usa un estilo; en este último, cree un nuevo UserControl.

Específicamente para su caso, elegiría un UserControl.


ejemplo de código (aunque no completa)

(Tenga en cuenta que una plantilla para el siguiente código se puede insertar con VS de "añadir nuevo control de usuario")

Xaml:

<UserControl x:Class="SomeNamespace.SidebarMenu" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <UserControl.Resources> <!-- you can define local styles here --> 
     <Style x:Key="SidebarMenuTextblock" TargetType=TextBlock> 
      ... 
     </Style> 
    </UserControl.Resources> 

    <Border Background=...> 
     <StackPanel> 

      <TextBlock 
       x:Name="Put_a_name_if_you_want_to_reference_this_item_in_code_behind" 
       Style="{StaticResource SidebarMenuTextblock}" 
       Text="{x:Static res:Resources.WinApp_SideBarMenu_Title}" /> 
      ...  </StackPanel> 
    </Border> 
</UserControl> 

.CS:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace SomeNamespace 
{ 
    public partial class SidebarMenu : UserControl 
    { 
     public NumericUpDown() 
     { 
      InitializeComponent(); 
     } 
     ... 
     // define here your properties etc, 
    } 
} 

Ahora, puede utilizar el control de esa manera:

<Window 
    x:Class="SomeOtherNamespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="clr-namespace:SomeNamespace"> 

    <Grid> 
     <controls:SidebarMenu PropertyIfYouDefinedOne="SomeValue"/> 
     ... 
    </Grid> 

</Window> 
1

Si usted puede conseguir sus manos en Expression Studio, Expression Blend, puede simplemente haga clic en cualquiera de control y convertir a un control de usuario. Tan fácil como eso.

Los controles de usuario son buenos para dividir el archivo XAML. En esencia, se usa para redefinir el comportamiento de un control existente.

Sin embargo, con los controles de usuario, puede definir controles de diseño WPF completos y convertirlos a un control de usuario, con el contenido de los niños dentro de ellos. Esto es muy útil para un proyecto distribuido entre múltiples desarrolladores, y también se puede usar para emular el comportamiento de un MDI, que en realidad está ausente en WPF.

+1

Y eso no es solo considerar controles reutilizables. Puede hacer esto con controles que no son reutilizables también. – r3st0r3

Cuestiones relacionadas