2009-04-23 13 views
6

È possibile modificare o modificare una parte specifica di un modello di controllo senza dover ricreare l'intero modello di controllo del controllo in xaml?È possibile sovrascrivere solo una parte di un modello di controllo in silverlight

Ad esempio, stavo cercando di eliminare il bordo di una casella di testo, in modo da poter creare una finestra di ricerca di base con angoli arrotondati (esempio xaml sotto). L'impostazione di borderthickness su 0 funziona bene, fino a quando non si passa il mouse sopra la casella di testo e uno pseudo bordo aggiunto al controllo lampeggia. Se guardo il controltemplate per la casella di testo, posso persino vedere lo stato visivo è chiamato, ma non riesco a pensare a come disabilitarlo.

Senza sovrascrivere il modello di controllo del controllo TextBox, in che modo posso interrompere il Visual State Manager che attiva l'effetto del mouse su 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> 

risposta

5

Ho trovato un modo per fare questo, ereditando fuori controllo e sovrascrivendo l'OnApplyTemplate. Non è l'ideale, ma penso che sia meglio che dover copiare l'intero modello di controllo. Ecco un esempio di creazione di una casella di testo senza bordi, in sostanza, disabilitando il mouse sopra stato visivo deselezionando sempre lo storyboard:

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

Il suo stato un po 'da quando ho usato XAML, ma no, non credo che si può solo modificare un pezzo del modello.

Tuttavia, se si dispone dell'IDE, è possibile creare una copia del modello attualmente applicato e modificare solo il pezzo desiderato e lasciare il resto così com'è. Vedere la sezione Come modificare di this link.

+0

Questo è esattamente quello che sto cercando di evitare di dover fare :) Ci si sente proprio come un taglio 'n incolla il disastro in attesa che accada! – mattmanser

+0

Sfortunatamente, penso che questo sia l'unico modo in cui applica il modello nel suo insieme e non solo singoli pezzi. Anche se non sono affatto un esperto, non ho mai trovato un modo per farlo. – Brandon

0

Recuperare il modello predefinito di ogni controllo, con il lettore XAML, quindi copiare/incollare e modificare ciò che si desidera ... non molto pulito ma penso che questo sia l'unico modo (I 'm alla ricerca come recuperare questo modello predefinito)

0

In WPF, non sono sicuro di silverlight qui un frammento di codice per recuperare il modello di Aero, si può provare a copiare/incollare e cambiare ciò che si vuole:

 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; 
     } 

Non ho mai usato Silverlight, ma non penso ci siano molte cose da fare per adattare questo modello a Silverlight.

Fonte

: Default template in WPF

Problemi correlati