2009-04-23 4 views
6

¿Es posible cambiar o modificar una parte específica de una plantilla de control sin tener que volver a crear toda la plantilla de control del control en xaml?¿Puede anular solo parte de una plantilla de control en silverlight

Por ejemplo, estaba tratando de deshacerme del borde de un cuadro de texto, por lo que podía juntar un cuadro de búsqueda básico con esquinas redondeadas (ejemplo xaml a continuación). Establecer el borde en 0 funciona bien, hasta que el mouse sobre el cuadro de texto y un pseudo borde que agregaron al control parpadee. Si miro la plantilla de control para el cuadro de texto, incluso puedo ver que el estado visual es nombrado, pero no puedo pensar en cómo deshabilitarlo.

Sin anular la plantilla de control del TextBox, ¿cómo podría detener el Visual State Manager activando el mouse sobre el efecto en el TextBox?

<Border Background="White" CornerRadius="10" VerticalAlignment="Center" HorizontalAlignment="Center" BorderThickness="3" BorderBrush="#88000000"> 
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Margin="5,0,0,0"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="16" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Path Height="13" Width="14" Stretch="Fill" Stroke="#FF000000" StrokeThickness="2" Data="M9.5,5 C9.5,7.4852815 7.4852815,9.5 5,9.5 C2.5147185,9.5 0.5,7.4852815 0.5,5 C0.5,2.5147185 2.5147185,0.5 5,0.5 C7.4852815,0.5 9.5,2.5147185 9.5,5 z M8.5,8.4999971 L13.5,12.499997" /> 
      <TextBox GotFocus="TextBox_GotFocus" Background="Transparent" Grid.Column="1" BorderThickness="0" Text="I am searchtext" Margin="5,0,5,0" HorizontalAlignment="Stretch" /> 
    </Grid> 
</Border> 

Respuesta

5

he encontrado una manera de hacer esto, heredando fuera del control y anulando el OnApplyTemplate. No es ideal, pero creo que es mejor que tener que copiar la plantilla de control completa. He aquí un ejemplo de cómo crear un cuadro de texto sin fronteras, la desactivación esencialmente el puntero del ratón sobre el estado visual siempre despejar el guión gráfico:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media.Animation; 

namespace SilverlightTestApplication 
{ 
    public class BorderlessTextBox : TextBox 
    { 
     public BorderlessTextBox() 
     { 
      BorderThickness = new System.Windows.Thickness(0); 
     } 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 

      //Get the mouse over animation in the control template 
      var MouseOverVisualState = GetTemplateChild("MouseOver") as VisualState; 

      if (MouseOverVisualState == null) 
       return; 

      //get rid of the storyboard it uses, so the mouse over does nothing 
      MouseOverVisualState.Storyboard = null; 
     } 
    } 
} 
2

Ha pasado un tiempo desde que usé XAML, pero no, no creo que pueda modificar una parte de la plantilla.

Sin embargo, si tiene el IDE, puede crear una copia de la plantilla actualmente aplicada y simplemente modificar la pieza que desee y dejar el resto tal como está. Vea la sección Cómo Editar de this link.

+0

eso es precisamente lo que estoy tratando de evitar tener que hacer :) Se siente como un corte 'n pegar desastre esperando a suceder! – mattmanser

+0

Lamentablemente, creo que esta es la única forma en que aplica la plantilla como un todo y no solo piezas individuales. Aunque de ninguna manera soy un experto, nunca he encontrado la manera de hacerlo. – Brandon

0

Recupere la plantilla predeterminada de cada control, con el lector XAML, luego copie/pegue y modifique lo que desea ... no muy limpio, pero creo que esta es la única forma (I 'm buscar cómo recuperar esta plantilla por defecto)

0

En WPF, no está seguro acerca de Silverlight aquí un fragmento de código para recuperar la plantilla de Aero, se puede tratar de copiar/pegar y cambiar lo que quiere:

 public Window1() 
     { 
      InitializeComponent(); 
      using(FileStream fs = new FileStream("C:/TextBoxTemplate.xaml", FileMode.Create)) 
      { 
       var res = LoadThemeDictionary(typeof(TextBox), "Aero", "NormalColor"); 
       var buttonRes = res[typeof(TextBox)]; 
       XamlWriter.Save(buttonRes, fs); 
      } 
     } 

     public static ResourceDictionary LoadThemeDictionary(Type t, 
     string themeName, string colorScheme) 
     { 
      Assembly controlAssembly = t.Assembly; 
      AssemblyName themeAssemblyName = controlAssembly.GetName(); 

      object[] attrs = controlAssembly.GetCustomAttributes(
        typeof(ThemeInfoAttribute), false); 
      if(attrs.Length > 0) 
      { 
       ThemeInfoAttribute ti = (ThemeInfoAttribute)attrs[0]; 

       if(ti.ThemeDictionaryLocation == 
                 ResourceDictionaryLocation.None) 
       { 
        // There are no theme-specific resources. 
        return null; 
       } 

       if(ti.ThemeDictionaryLocation == 
           ResourceDictionaryLocation.ExternalAssembly) 
       { 
        themeAssemblyName.Name += "." + themeName; 
       } 
      } 

      string relativePackUriForResources = "/" + 
        themeAssemblyName.FullName + 
        ";component/themes/" + 
        themeName + "." + 
        colorScheme + ".xaml"; 

      Uri resourceLocater = new System.Uri(
        relativePackUriForResources, System.UriKind.Relative); 

      return Application.LoadComponent(resourceLocater) 
           as ResourceDictionary; 
     } 

Nunca he usado Silverlight, pero no creo que haya muchas cosas que hacer para adaptar esta plantilla a Silverlight.

Fuente: Default template in WPF

Cuestiones relacionadas