2010-01-28 23 views
5

Tôi đang cố gắng mở rộng kiểu cơ sở cho một TextBlock. Suy nghĩ đơn giản trong thế giới WPF, nên giống nhau trong Silverlight. Nhưng tôi gặp lỗi trên x: Type.Tương đương Silverlight 3.0 cho BaseOn = "{StaticResource {x: Type TextBlock}}"

Làm cách nào để dịch BaseOn = "{StaticResource {x: Type TextBlock}}" trong Silverlight. Bất kỳ ai ngoài kia đã đạt được điều này?

Cảm ơn bạn.

+0

Bạn có thể thực sự làm điều này ngay bây giờ trong Silverlight 5. Xem câu trả lời của tôi dưới đây –

Trả lời

5

Có không phải là một tương đương với việc sử dụng đặc biệt trong Silverlight. Silverlight chỉ hỗ trợ các khóa chuỗi để truy cập Tài nguyên. Do đó việc sử dụng {x:Type SomeType} làm khóa không hoạt động.

Trong Silverlight, bạn cần tạo bản sao đầy đủ của kiểu điều khiển. Bạn có thể làm điều này bằng cách sử dụng Blend có các công cụ để thực hiện việc này hoặc bằng cách copy'n'pasting nó từ tài liệu Silverlight. Control Styles and Templates

Tất nhiên khi bạn có bản sao kiểu ban đầu, bạn có thể sửa đổi bản sao của mình hoặc tạo các kiểu khác chỉ định bản sao này cho BasedOn để tạo một tập hợp các biến thể.

+0

Xin chào Anthony, Tôi sợ ai đó sẽ nói điều này, cũng không có gì để làm sau đó để có được để làm việc sau đó: ( – Calin

0

nên nên được (và according to Jesse Liberty)
BasedOn="{StaticResource TextBlock}"

+0

Hi Muad'Dib, Tôi nhận được "Không thể tìm thấy một tài nguyên với tên/khóa TextBlock" phù thủy thực sự là không đúng bởi vì tôi rõ ràng bằng cách sử dụng TwilightBlueTheme từ bộ công cụ Silverlight. – Calin

3

Tôi nghĩ nó sẽ làm việc để đi một chút về phía sau, bạn có thể làm cho phong cách cơ sở của bạn

<Style TargetType="Button" x:Key="MyButtonStyle"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 

sau đó bạn có thể căn cứ tất cả các nút trên phong cách mà

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" /> 

Sau đó, nếu bạn cần thêm theo phong cách đó, bạn có thể chỉ dựa trên kiểu được đặt tên

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 

hoặc

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" x:Key="MyOtherButtonStyle"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 
0

Bạn thực sự có thể làm điều này bây giờ trong Silverlight 5.

Thứ nhất, tuyên bố phong cách của bạn

<Style x:Key="TextBoxStyle" TargetType="TextBox" BasedOn="{local:Type TypeName=TextBox}"> 

</Style> 

Tiếp theo, bạn cần phải tạo ra một MarkupExtension trong đó hoạt động trong cả hai WPF và Silverlight 5 để thay thế x: Loại

/// A MarkupExtension which introduces x:Type like syntax to both WPF and Silverlight (Cross-platform). This is used internally 
/// for the themes, but is also useful e.g. when creating custom Control Templates for SciChart 
/// </summary> 
/// <remarks> 
/// Licensed under the CodeProject Open License 
/// http://www.codeproject.com/Articles/305932/Static-and-Type-markup-extensions-for-Silverlight 
/// </remarks> 
/// 
public class TypeExtension : MarkupExtension 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="TypeExtension" /> class. 
    /// </summary> 
    public TypeExtension() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="TypeExtension" /> class. 
    /// </summary> 
    /// <param name="type">The type to wrap</param> 
    public TypeExtension(Type type) 
    { 
     Type = type; 
    } 

    /// <summary> 
    /// Gets or sets the type information for this extension. 
    /// </summary> 
    public System.Type Type { get; set; } 

    /// <summary> 
    /// Gets or sets the type name represented by this markup extension. 
    /// </summary> 
    public String TypeName { get; set; } 

    public override Object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Type == null) 
     { 
      if (String.IsNullOrWhiteSpace(TypeName)) throw new InvalidOperationException("No TypeName or Type specified."); 
      if (serviceProvider == null) return DependencyProperty.UnsetValue; 

      IXamlTypeResolver resolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver; 
      if (resolver == null) return DependencyProperty.UnsetValue; 

      Type = resolver.Resolve(TypeName); 
     } 
     return Type; 
    } 
} 

Tested như làm việc trong WPF và Silverlight

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