Optimizar el rendimiento: Recursos de la aplicaciónOptimizing Performance: Application Resources

WPFWPF le permite compartir recursos de la aplicación para que pueda admitir un comportamiento o aspecto coherente entre los elementos de tipo similar.allows you to share application resources so that you can support a consistent look or behavior across similar-typed elements. Este tema se proporcionan algunas recomendaciones de esta área que puede ayudarle a mejoran el rendimiento de las aplicaciones.This topic provides a few recommendations in this area that can help you improve the performance of your applications.

Para más información sobre los recursos, vea Recursos XAML.For more information on resources, see XAML Resources.

Uso compartido de recursosSharing resources

Si la aplicación utiliza controles personalizados y define los recursos en un ResourceDictionary (o nodo de recursos XAML), se recomienda que se puede definir los recursos en el Application o Window objeto de nivel, o bien definirlos en el tema predeterminado para el controles personalizados.If your application uses custom controls and defines resources in a ResourceDictionary (or XAML Resources node), it is recommended that you either define the resources at the Application or Window object level, or define them in the default theme for the custom controls. Definición de recursos en un control personalizado ResourceDictionary afecta negativamente al rendimiento de cada instancia de ese control.Defining resources in a custom control's ResourceDictionary imposes a performance impact for every instance of that control. Por ejemplo, si tiene operaciones de rendimiento intensivo pincel definidas como parte de la definición de recursos de un control personalizado y el número de instancias del control personalizado, espacio de trabajo de la aplicación aumentará significativamente.For example, if you have performance-intensive brush operations defined as part of the resource definition of a custom control and many instances of the custom control, the application's working set will increase significantly.

Para ilustrar este punto, considere lo siguiente.To illustrate this point, consider the following. Supongamos que está desarrollando un juego de tarjeta con WPFWPF.Let's say you are developing a card game using WPFWPF. Para la mayoría de los juegos de cartas, necesita 52 cartas con 52 caras diferentes.For most card games, you need 52 cards with 52 different faces. Decide implementar un control personalizado de la tarjeta y definir 52 pinceles (cada uno representa una carta cara) en los recursos de su control personalizado de la tarjeta.You decide to implement a card custom control and you define 52 brushes (each representing a card face) in the resources of your card custom control. En la aplicación principal, crear inicialmente 52 instancias de este control personalizado de la tarjeta.In your main application, you initially create 52 instances of this card custom control. Cada instancia del control personalizado tarjeta genera 52 instancias de Brush objetos, que le da un total de 52 * 52 Brush objetos en la aplicación.Each instance of the card custom control generates 52 instances of Brush objects, which gives you a total of 52 * 52 Brush objects in your application. Moviendo los pinceles de los recursos del control personalizado a la Application o Window nivel de objeto o que definirlas en el tema predeterminado para el control personalizado, reducir el espacio de trabajo de la aplicación, ya que ahora están compartiendo el 52 pinceles entre las 52 instancias del control de tarjeta.By moving the brushes out of the card custom control resources to the Application or Window object level, or defining them in the default theme for the custom control, you reduce the working set of the application, since you are now sharing the 52 brushes among 52 instances of the card control.

Compartir un pincel sin copiarSharing a Brush without Copying

Si tiene varios elementos con el mismo Brush objeto, definir el pincel como un recurso y hacer referencia a él, en lugar de definir el pincel insertado en XAMLXAML.If you have multiple elements using the same Brush object, define the brush as a resource and reference it, rather than defining the brush inline in XAMLXAML. Este método creará una instancia y volver a usarla, mientras que definir pinceles alineado en XAMLXAML crea una nueva instancia para cada elemento.This method will create one instance and reuse it, whereas defining brushes inline in XAMLXAML creates a new instance for each element.

Ejemplo de marcado siguiente ilustra este punto:The following markup sample illustrates this point:

<StackPanel.Resources>
  <LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
    <LinearGradientBrush.GradientStops>
      <GradientStopCollection>
        <GradientStop Color="GoldenRod" Offset="0" />
        <GradientStop Color="White" Offset="1" />
      </GradientStopCollection>
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
</StackPanel.Resources>

<!-- Non-shared Brush object. -->
<Label>
  Label 1
  <Label.Background>
    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Color="GoldenRod" Offset="0" />
          <GradientStop Color="White" Offset="1" />
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Label.Background>
</Label>

<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>

Usar recursos estáticos siempre que sea posibleUse Static Resources when Possible

Un recurso estático proporciona un valor para cualquier atributo de propiedad XAML buscando una referencia a un recurso ya definido.A static resource provides a value for any XAML property attribute by looking up a reference to an already defined resource. Comportamiento de búsqueda de ese recurso es análogo a la búsqueda de tiempo de compilación.Lookup behavior for that resource is analogous to compile-time lookup.

Un recurso dinámico, por otro lado, creará una expresión temporal durante la compilación inicial y, por tanto, aplazar la consulta de recursos hasta que el valor del recurso solicitado sea realmente necesario para construir un objeto.A dynamic resource, on the other hand, will create a temporary expression during the initial compilation and thus defer lookup for resources until the requested resource value is actually required in order to construct an object. Comportamiento de búsqueda de ese recurso es análogo a la búsqueda de tiempo de ejecución, que afecta negativamente al rendimiento.Lookup behavior for that resource is analogous to run-time lookup, which imposes a performance impact. Usar recursos estáticos siempre que sea posible en la aplicación con los recursos dinámicos solo cuando sea necesario.Use static resources whenever possible in your application, using dynamic resources only when necessary.

Ejemplo de marcado siguiente muestra el uso de ambos tipos de recursos:The following markup sample shows the use of both types of resources:

<StackPanel.Resources>
  <SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>

<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>

<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>

Vea tambiénSee also