2011-04-22 9 views
24

tengo unas pocas cosas en XAML¿Cómo configurar la plantilla de control en el código?

<ControlTemplate TargetType="{x:Type Button}"> 
    <Image ...> 
</ControlTemplate> 

que quiero lograr en el mismo código en C#. ¿Cómo puedo conseguir esto?

ControlTemplate ct = new ControlTemplate();.. 
Image img = new Image();.. 

Ahora, ¿cómo asignar esta imagen a la plantilla de control? ¿Podemos hacer esto o me falta algún concepto aquí?

Respuesta

26

Crear una plantilla en codebehind no es una buena idea, en teoría, uno haría esto definiendo el ControlTemplate.VisualTree que es un FrameworkElementFactory.

ControlTemplate template = new ControlTemplate(typeof(Button)); 
var image = new FrameworkElementFactory(typeof(Image)); 
template.VisualTree = image; 

Asignación de propiedades es muy indirecta ya que se necesita para usar SetValue y SetBinding:

image.SetValue(Image.SourceProperty, ...); 

Además, sobre la respuesta aceptada (anteriormente) y el material citado:

Ajuste de la ControlTemplate programáticamente es como usar XAML porque tenemos que usar el X clase amlReader

Esta afirmación es simplemente incorrecto, no qué "tenemos que".


Si asigno las plantillas en tiempo de ejecución, las defino como un recurso que puedo cargar si lo necesito.


Editar: Según la documentación FrameworkElementFactory se desuso:

Esta clase es una forma obsoleta para crear mediante programación de plantillas, que son subclases de FrameworkTemplate tales como ControlTemplate o DataTemplate; no toda la funcionalidad de la plantilla está disponible cuando crea una plantilla usando esta clase. La forma recomendada de crear una plantilla mediante programación es cargar XAML desde una cadena o una secuencia de memoria utilizando el método Load de la clase XamlReader.

Me pregunto si esta recomendación es una buena idea. Personalmente, seguiría definiendo la plantilla como un recurso en XAML si puedo evitar hacerlo con cadenas y el XamlReader.

+0

Gracias funcionó perfectamente ... Sé que no es una buena idea, pero no tengo otra opción en un caso particular –

+0

Bueno, acabo de citar el texto del sitio que encontré .. Y qué pasa con el uso de 'XamlReader.Parse ¿? –

+0

@Ai_boy: Es solo un análisis de XAML, que es innecesario y no es algo que recomendaría, si tiene XAML estático, es mejor crearlo como recurso XAML en lugar de piratear una cadena XML en código subyacente. –

21

http://www.eggheadcafe.com/sample-code/SilverlightWPFandXAML/73fdb6a2-6044-4c43-8766-afa12618ddc1/set-controltemplate-programmatically.aspx

Ajuste del ControlTemplate programación es como si se utilizara XAML porque tenemos que utilizar la clase XamlReader. Por ejemplo, aquí está el código para establecer la plantilla de un botón, asumiendo que queremos establecer una plantilla de botón después de que se cargue.

private void Button_Loaded(object sender, RoutedEventArgs e) { 
    var button = sender as Button; 
    string template = 
     "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
      TargetType=\"Button\">" + 
      "<Border>" + 
       "<ContentPresenter/>" + 
      "</Border>" + 
     "</ControlTemplate>"; 
    button.Template = (ControlTemplate)XamlReader.Parse(template); 
} 

ya que utilizamos una cadena para especificar el código XAML para la plantilla, se puede utilizar el método Parse del XamlReader. El XamlReader también tiene un método Load, que se utiliza principalmente para transmisiones o lectores XAML o XML . Tenga en cuenta que debe incluir el espacio de nombres XML http://schemas.microsoft.com/winfx/2006/xaml/presentation porque ControlTemplate, Border, y otros controles que necesitamos se definen allí . Si no lo incluimos, vamos a encontrar una excepción en tiempo de ejecución. Básicamente, tenemos que poner los espacios de nombres necesarios para la plantilla.

0

Si solo necesita cambiar la imagen del botón, puede hacer una cosa.
1. Cree una propiedad de dependencia que representará cuando desee cambiar la imagen (un bool) o puede crear una enumeración que tenga todas las imágenes posibles, por ejemplo 2. Enum Images {Image1 = 0, Image2 = 1, Image2 = 3}. Cree una propiedad de dependencia "CurrentButtonImage" de este tipo que se asociará con el botón.

Ahora en XAML utilizar esto en la plantilla del botón

sobre el cambio de propiedad de CurrentButtonImage actualizar la imagen de botón (en el código detrás) usando

CurrentImagePropertyChangedhandler (...., ...)
{
interruptor (CurrentButtonImage)
{
caso "Image1":
this._ButtonImage.Fill = (DrawingBrush) csd.FindResource ("Image1DrawingBrus h ");

Cuestiones relacionadas