c# wpf xaml contentcontrol

c# - ¿Cómo establecer la plantilla de control en el código?



wpf xaml (3)

Crear una plantilla en código subyacente no es una buena idea, en teoría, uno haría esto definiendo ControlTemplate.VisualTree que es FrameworkElementFactory .

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

La asignación de propiedades es muy indirecta ya que necesita usar SetValue y SetBinding :

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

Además, sobre la respuesta (previamente) aceptada y las cosas citadas:

Configurar ControlTemplate programmatically es como usar XAML porque tenemos que usar la clase XamlReader.

Esa afirmación es simplemente incorrecta, no " debemos hacerlo " .

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

Editar: según la documentación, FrameworkElementFactory está en desuso:

Esta clase es una forma obsoleta de crear plantillas mediante programación, que son subclases de FrameworkTemplate 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 .

Tengo esto en XAML

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

Quiero lograr lo mismo en el código 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í?


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 usa esto en la plantilla del botón

En la propiedad Cambio de CurrentButtonImage actualice la imagen del botón (en el código detrás) usando

CurrentImagePropertyChangedhandler (...., ...)
{
cambiar (CurrentButtonImage)
{
caso "Imagen1":
this._ButtonImage.Fill = (DrawingBrush) csd.FindResource ("Image1DrawingBrush");


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

Configurar ControlTemplate programmatically es como usar XAML porque tenemos que usar la clase XamlReader. Por ejemplo, aquí está el código para establecer la plantilla de un botón, asumiendo que queremos establecer la plantilla de un 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); }

Como usamos una cadena para especificar el código XAML para la plantilla, podemos usar el método Parse de XamlReader. El XamlReader también tiene un método Load, que se usa principalmente para transmisiones o lectores XAML o XML. Tenga en cuenta que debemos incluir el espacio de nombres XML http://schemas.microsoft.com/winfx/2006/xaml/presentation porque ControlTemplate, Border y otros controles que necesitamos están definidos allí. Si no lo incluimos, encontraremos una excepción de tiempo de ejecución. Básicamente, tenemos que poner los espacios de nombres necesarios para la plantilla.