2010-12-27 38 views
8

Creo que estoy pidiendo una conferencia sobre la correcta aplicación de WPF aquí, pero voy a arriesgarme ya que estoy al final de mi ingenio. Creo que esto es probablemente el resultado de mi letargo al adoptar completamente las plantillas y estilos de WPF, así que estoy feliz de escuchar tales conferencias.ContentControl personalizado en WPF

Estoy escribiendo una especie de editor de audio/orquestador de eventos. Tengo un editor de pistas con el que estoy bastante contento. Sin embargo, lo construí en gran medida con controles personalizados (lo sé, esto es probablemente un pecado de WPF). De acuerdo con ese tema, quiero hacer un encabezado estándar para las pistas, pero quiero que los "tipos" de pistas individuales puedan definir lo que va en ese encabezado. Pensé que un control que define una especie de "agarre" en el borde y luego le permitió al implementador "completar" la sustancia funcionaría bien. Sin embargo, no tengo idea de cómo hacer esto en WPF sin usar estilos e incluso si termino usando estilos, me gustaría entender esto.

Esto probablemente se deba a querer una especie de implementación ejemplar de un control de ContentControl simple (por ejemplo, un botón) y no poder encontrar uno (que no sea AvalonDock, que en última instancia utiliza - correctamente estoy seguro - plantillas para esto) En mi cabeza, el XAML es como la siguiente:

<ContentControl x:Class="TestArea.CustomContentControl2" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="Hello"/> 
    <ContentPresenter Grid.Column="1"/> 
</Grid> 

Pero, por supuesto, eso no funciona. Estoy bastante seguro de que podría sacar lo mismo haciendo trucos con sobrecargas detrás de escena, pero sería bueno si pudiera hacer algo como esto. ¿Realmente tengo que dejar atrás todos mis caminos terribles y de procedimiento y usar estos estilos de los que hablas? Si es así, ¿alguien puede decirme al menos cómo se ve ese botón en el marco?

Respuesta

4

Aquí es un ejemplo completo de derivados de ContentControl para lograr lo que quiere: Creating Customized UserControls (Deriving from ContentControl) in WPF 4

ContentPresenter de Pete está haciendo lo mismo que lo hace en su ejemplo.

+0

Este es el enfoque de estilo al que me refería. OK, cuando estés en Roma/Redmond ... – Jeff

+0

No necesitas ir "cerdo entero" con estilos y plantillas. Esto es solo un medio para un fin: dejar que el interior sea contenido arbitrario. Así que ponga lo que tiene arriba en ControlTemplate en lugar de UserControl y el resultado final es exactamente lo que está buscando. ¡No se requiere conversión religiosa! –

+0

El enlace está muerto. – Kilazur

1

El uso de estilos le permite separar la funcionalidad de un control con la representación de un control; como el Button.

Piense como un control al principio como nada más que la funcionalidad. Una clase simple que contiene eventos predefinidos, propiedades, etc. Una vez que el control asume el trabajo de formar parte de un árbol visual, ahora necesita una identidad visual. No necesitaba uno previamente; sin embargo ahora lo hace. Definir un estilo predeterminado permite que el control tenga ahora una representación visual que no necesitaba antes, ya que no estaba viviendo dentro del árbol visual.

Ignorar estilos sería como ignorar CSS al hacer uso de HTML.

Cuestiones relacionadas