2009-04-23 36 views
6

Có thể thay đổi hoặc sửa đổi một phần cụ thể của mẫu kiểm soát mà không phải tạo lại toàn bộ mẫu điều khiển của điều khiển trong xaml không?Bạn có thể ghi đè lên một phần mẫu kiểm soát trong silverlight

Ví dụ: tôi đang cố gắng loại bỏ đường viền của hộp văn bản, vì vậy tôi có thể ném cùng một hộp tìm kiếm cơ bản với các góc tròn (ví dụ xaml bên dưới). Thiết lập borderthickness là 0 hoạt động tốt, cho đến khi bạn di chuột qua hộp văn bản và một đường viền giả họ thêm vào điều khiển nhấp nháy. Nếu tôi nhìn vào controltemplate cho hộp văn bản, tôi thậm chí có thể nhìn thấy trạng thái trực quan được đặt tên, nhưng không thể nghĩ ra làm thế nào để vô hiệu hóa nó.

Không ghi đè mẫu kiểm soát của hộp văn bản, làm cách nào để ngăn Trình quản lý trạng thái trực quan kích hoạt chuột trên hiệu ứng trên 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> 

Trả lời

5

Tôi đã tìm thấy một cách để làm điều này, bởi kế thừa ra khỏi sự kiểm soát và trọng OnApplyTemplate. Nó không lý tưởng, nhưng tôi nghĩ tốt hơn là phải sao chép toàn bộ mẫu kiểm soát. Dưới đây là ví dụ về cách tạo hộp văn bản không viền, về cơ bản là vô hiệu hóa chuột qua trạng thái trực quan bằng cách luôn xóa bảng phân cảnh:

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

Đã lâu rồi kể từ khi tôi sử dụng XAML, nhưng không, tôi không tin bạn chỉ có thể sửa đổi một phần của mẫu.

Tuy nhiên nếu bạn có IDE, bạn có thể tạo bản sao của mẫu hiện đang được áp dụng và chỉ sửa đổi phần bạn muốn và để phần còn lại như cũ. Xem phần Cách chỉnh sửa của this link.

+0

Đó chính là điều tôi đang cố gắng tránh phải làm :) dán thảm họa chờ đợi để xảy ra! – mattmanser

+0

Thật không may, tôi nghĩ rằng đây là cách duy nhất vì nó áp dụng các mẫu như một toàn thể và không chỉ là miếng cá nhân. Mặc dù tôi không phải là một chuyên gia, tôi chưa bao giờ tìm ra cách để làm điều đó. – Brandon

0

Lấy mẫu mặc định của mọi điều khiển, bằng trình đọc XAML, sau đó sao chép/dán và sửa đổi nội dung bạn muốn ... không phải rất sạch nhưng tôi nghĩ đây là cách duy nhất (tôi 'm tìm cách lấy mẫu mặc định này)

0

trong WPF, không chắc chắn về Silverlight đây một đoạn mã để lấy mẫu của Aero, bạn có thể cố gắng sao chép/dán và thay đổi những gì bạn muốn:

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

Tôi chưa bao giờ sử dụng Silverlight, nhưng tôi không nghĩ có nhiều việc cần làm để thích ứng với mẫu này với Silverlight.

Nguồn: Default template in WPF

Các vấn đề liên quan