2009-09-29 11 views
14

Estoy creando un control personalizado simple que se extiende desde el botón de alternar que permite al usuario especificar contenido marcado y no verificado directamente en XAML. Funciona bien, pero se basa en un disparador, y no sé cómo definir el desencadenador, excepto en un estilo. Si defino el estilo, entonces pierdo cualquier cosa establecida fuera del control personalizado.Cómo agregar un desencadenador a un control personalizado WPF sin anular el estilo existente?

Lo que me gustaría hacer es agregar este activador a cualquier estilo existente establecido en otra parte del control.

Aquí está el XAML para el estilo/activador.

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

he intentado heredar el estilo a través de la BasedOn con un tipo de defecto, pero no va a funcionar si el control personalizado tiene un estilo explícito establecido por su padre. También consideré EventTriggers, pero no creo que haya un evento para inicializar el control.

Gracias por cualquier ayuda que cualquiera pueda ofrecer. :)

Respuesta

17

Solo para aclarar la terminología aquí: Un control de usuario es un control que se deriva de la clase UserControl. Si te entendí bien, obtuviste de ToggleButton para agregar las propiedades Desactivar contenido y Verificar contenido. En ese caso, ha creado un control personalizado . Siempre es más fácil de seguir si estamos de acuerdo en la terminología común :)

Por lo que sé, no se puede hacer una herencia de estilo genérico en XAML. Siempre debe especificar explícitamente en qué estilo se basa otro estilo. Su estilo puede basarse en el estilo predeterminado para ToggleButton o en otro estilo específico. Si no puede construir una cadena de herencia de estilo que respete eso, este enfoque no funcionará.

Pero como tiene un control personalizado, ¿no podría escribir un estilo predeterminado basado en el estilo de botón de alternar predeterminado como este?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

A continuación, siempre que se aplica un estilo explícito a un botón de activación debe especificar que se basa en el estilo de botón de activación por defecto.

También podría escribir una plantilla de control (predeterminada) para su nuevo botón de alternar en Themes \ Generic.xaml que contiene los desencadenantes anteriores. En blend, puede obtener una copia de la plantilla predeterminada para el botón de alternar ("Editar plantilla" -> "Editar una copia") para que pueda asegurarse de que su botón de alternar se ve exactamente como el botón de alternar normal. Luego incorpora los desencadenantes anteriores en esa plantilla.

BTW: no tiene que crear un nuevo control simplemente para agregar nuevas propiedades. Puede agregar nuevas propiedades a un control existente usando attached properties. Se pueden usar desde XAML al igual que las propiedades normales.

+0

Gracias por la entrada, fue muy útil. Tomé una ruta un poco diferente y extendí el estilo existente en el código para agregar mi activador sin arruinar el existente. La sugerencia de BasedOn que hizo ya lo había intentado y no funciona si se establece un estilo explícito. Llegué de tus ideas, así que lo estoy marcando como la respuesta. La idea de las propiedades adjuntas fue realmente buena e hice ese cambio también, gracias. :) –

+1

¿Te importaría publicar algunos detalles de lo que hiciste? Me gustaría hacer lo mismo. – stone

+0

Esto me acaba de ahorrar un montón de código. ¡Gracias! – MattS423

Cuestiones relacionadas