2009-04-23 3 views
6

Возможно ли изменить или изменить определенную часть шаблона управления без необходимости воссоздать весь шаблон управления элемента управления в xaml?Можете ли вы переопределить только часть шаблона управления в silverlight

Например, я пытался избавиться от границы текстового поля, поэтому я мог бы сбрасывать базовое поле поиска с закругленными углами (пример xaml ниже). Установка borderthickness на 0 отлично работает, пока вы не нажмете над текстовым полем и не будет добавлена ​​псевдограница, добавленная в элемент управления. Если я посмотрю на controltemplate для текстового поля, я даже вижу, что визуальное состояние называется, но не может думать о том, как его отключить.

Без переопределения шаблона управления TextBox, как бы остановить диспетчера визуальных состояний, нажав кнопку мыши на эффект 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> 

ответ

5

Я нашел способ сделать это, унаследовав от контроля и перекрывая OnApplyTemplate. Это не идеально, но я думаю, что это лучше, чем копировать весь шаблон управления. Вот пример создания полей текстового поля, по существу, отключение мыши на визуальном состоянии, всегда очищая раскадровку:

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

С тех пор как я использовал XAML, но нет, я не верю, что вы можете просто изменить часть шаблона.

Однако, если у вас есть IDE, вы можете создать копию применяемого в настоящее время шаблона и просто изменить часть, которую хотите, и оставить остальное как есть. См. Раздел «Как редактировать»: this link.

+0

Это именно то, что я пытаюсь, чтобы избежать необходимости делать :) Он просто чувствует, как вырезать н вставить бедствие ждет! – mattmanser

+0

К сожалению, я считаю, что это единственный способ применения шаблона в целом, а не только отдельных частей. Хотя я никоим образом не специалист, я никогда не нашел способ это сделать. – Brandon

0

Извлеките шаблон по умолчанию для каждого элемента управления с помощью считывателя XAML, затем скопируйте/вставьте и измените то, что вы хотите ... не очень чистый, но я думаю, что это единственный способ (I «м поиска, как получить шаблон это по умолчанию)

0

в WPF, не уверен, что о Silverlight здесь фрагмент кода, чтобы восстановить шаблон Aero, вы можете попытаться скопировать/вставить и изменить то, что вы хотите:

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

Я никогда не пользовался Silverlight, но я не думаю, что для адаптации этого шаблона к Silverlight требуется много всего.

Источник: Default template in WPF

Смежные вопросы