2011-09-09 29 views
5

Dudo que esto sea posible, pero solo quería confirmarlo.Aplicación de estilos WPF como CSS y Html

Estoy escribiendo una aplicación WPF simple y quiero que mi estilo se defina externamente, por lo que básicamente podría cargar el estilo como un recurso externo. Un poco como cómo CSS y HTML generalmente se separan ...

Sin embargo, una cosa que me molesta es que con HTML & CSS es más un enfoque externo, el CSS se dirige a los elementos y se aplica a los elementos coincidentes . Sin embargo, con WPF parece que es al revés, tienes que decirle al elemento qué estilos debería haber aplicado, sin embargo, esto no parece muy dinámico. Así que solo quiero saber si hay una manera de aplicar estilos para que los estilos solo se centren en los elementos.

Un ejemplo sería algo así como:

<Style TargetType="{x:Type TextBox}" TargetElement="{x:Name SomeTextboxElement}"> 
    <Setter Property="Width" Value="Auto"/> 
</Style> 

Como normalmente se tiene que especificar una clave con el estilo, a continuación, obtener el elemento (SomeTextboxElement) para asignar a las llaves de su estilo.

Parece un poco tonto tener que dar explícitamente a cada elemento un enlace de estilo, debería ser más jerárquico y filtrar hacia abajo (lo que es posible, no sé cómo) y no ser un mapeo uno a uno. Llevaría para siempre con el estilo de toda una aplicación ...

esperanza que tiene sentido ...

Respuesta

2

lo que dices que estás buscando es interesante, pero no funciona con el modo de pensar de WPF, en el que se aplicar un estilo al tipo visual o visual (es decir, puede aplicar un estilo a un tipo determinado o definir un estilo como un recurso con una clave con nombre y usar esa clave explícitamente). En su caso, creo que la creación de un estilo como el siguiente debe hacer:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Width" Value="Auto"/> 
</Style> 

Esto se aplicará a su estilo todos los cuadros de texto, simplemente dejar de lado el atributo targetElement.

Sé que esto no es lo mismo, pero si quieres el mismo estilo de control básico con solo unos pocos cambios dependiendo del uso, puedes probar con un Trigger que hace pequeños cambios. Usualmente uso el atributo "Etiqueta" de mis controles para dar un poco de información adicional a mi definición de estilo. Ejemplo de estilo de botón básico, pero 3 botones:

 <Style.Triggers> 
      <Trigger Property="Tag" Value="delete"> 
       <Setter Property="Background" Value="Red"></Setter> 
      </Trigger> 
      <Trigger Property="Tag" Value="confirm"> 
       <Setter Property="Background" Value="Green"></Setter> 
      </Trigger> 
     </Style.Triggers> 

Ahora algunas hipótesis. Lo que quiere, sería muy muy fácil de implementar si se cumplen dos condiciones:

  • visuales Todo WPF tienen un DependencyProperty llamado "ParentVisual", devolviendo el visual que contiene inmediato lo visual en cuestión.
  • visuales Todo WPF tienen un DepencyProperty, diga "VisualType"

Teniendo en cuenta que y combinando esto con disparadores/multitriggers entonces dejaría de crear disparadores para ParentVisual.VisualType.

Definamos un CSS hipotético para que WPF aplique un estilo a cualquier cuadro de texto que esté dentro del borde con el Id "subnavi" contenido en una cuadrícula.

Grid Border#subnavi TextBox 
{ 
    backgroundColor:#FF0000; 
} 

Traducido en WPF, esto sería un MultiTrigger para el cuadro de texto con tres condiciones:

<MultiTrigger> 
    <Condition Property="ParentVisual.VisualType" Value="Border"></Condition> 
    <Condition Property="ParentVisual.Name" Value="subnavi"></Condition> 
    <Condition Property="ParentVisual.ParentVisual.VisualType" Value="Grid"></Condition> 
    <Setter Property="Background" Value="Red"/> 
    </MultiTrigger> 

Pero, por desgracia, no hay tal DependencyProperties, por lo que sólo será capaz de utilizar el mecanismo Mencioné arriba si crea envoltorios para cada uno de los controles wpf.

Para volver a lo que llamé la mentalidad de WPF: los elementos de WPF son diseñados por el motor de WPF caminando el árbol visual hacia arriba, no hacia abajo, comenzando por el control en cuestión. CSS funciona al revés, creo.

EDIT: Creo que podría ser más recomendable utilizar la clase DependencyObject que usar Visual en lo que escribí anteriormente.

+0

Es una pena, como WPF parecía estar reduciendo la brecha entre desarrollador web y desarrollador de aplicaciones , no es el fin del mundo tener que dar a cada objeto un nombre de estilo explícito, ya que podría ser anulado de todos modos, pero parece que un poco más trabajo para mantener y cambiar en el futuro. – somemvcperson

0

Está buscando estilos implícitos. No son tan granulares como los selectores de CSS, pero puede definir un estilo para cada tipo de elemento. Por ejemplo, el siguiente ejemplo dice: "Quiero que todos mis botones tengan un ancho de 80"

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Width" Value="80"/> 
</Style> 

Estas definiciones se pueden hacer en varios ámbitos diferentes: la aplicación, la página, el control, o cualquier elemento de marco con sólo agregándolo como un recurso. El tiempo de ejecución tomará un enfoque ascendente cuando busque un estilo implícito, y usará el primero que funda.

Eche un vistazo a this article para más detalles.

Cuestiones relacionadas