2010-11-16 35 views
5

Trong ứng dụng wpf của tôi, tôi cần phải lấy cọ nền của nút chủ đề để vẽ nền của một điều khiển khác.Trong WPF, làm thế nào để có được nền nút của chủ đề hiện tại?

Tôi đã thử tham chiếu PresentationFramework.Aero.dll và sử dụng ButtonChrome, nhưng không may mắn cho đến nay.

Tôi đã thử sử dụng VisualStyleRenderer, nhưng có vẻ như lớp này chỉ có thể được sử dụng để vẽ nền (tôi không thể lấy cọ vẽ và đặt làm nền của điều khiển khác).

Bất kỳ ý tưởng nào?

Kind Regards, Eduardo Melo

Trả lời

9

Nó có thể được thực hiện trong mã bằng cách nhìn lên nút mặc định phong cách trong các nguồn:

private static object GetValueFromStyle(object styleKey, DependencyProperty property) 
    { 
     Style style = Application.Current.TryFindResource(styleKey) as Style; 
     while (style != null) 
     { 
      var setter = 
       style.Setters 
        .OfType<Setter>() 
        .FirstOrDefault(s => s.Property == property); 

      if (setter != null) 
      { 
       return setter.Value; 
      } 

      style = style.BasedOn; 
     } 
     return null; 
    } 

    ... 

    this.Background = GetValueFromStyle(typeof(Button), BackgroundProperty) as Brush; 

Nếu bạn cần phải làm điều đó trong XAML, bạn có thể dễ dàng tạo tiện ích đánh dấu từ đoạn code trên:

public class ValueFromStyleExtension : MarkupExtension 
{ 
    public ValueFromStyleExtension() 
    { 
    } 

    public object StyleKey { get; set; } 
    public DependencyProperty Property { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (StyleKey == null || Property == null) 
      return null; 
     object value = GetValueFromStyle(StyleKey, Property); 
     if (value is MarkupExtension) 
     { 
      return ((MarkupExtension)value).ProvideValue(serviceProvider); 
     } 
     return value; 
    } 

    private static object GetValueFromStyle(object styleKey, DependencyProperty property) 
    { 
     Style style = Application.Current.TryFindResource(styleKey) as Style; 
     while (style != null) 
     { 
      var setter = 
       style.Setters 
        .OfType<Setter>() 
        .FirstOrDefault(s => s.Property == property); 

      if (setter != null) 
      { 
       return setter.Value; 
      } 

      style = style.BasedOn; 
     } 
     return null; 
    } 
} 

XAML

Background="{util:ValueFromStyle StyleKey={x:Type Button}, Property=Control.Background}"> 

EDIT: cố định ValueFromStyleExtension đối với trường hợp trong đó giá trị được định nghĩa là một DynamicResource (hoặc ME khác)

+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều. :) – EdMelo

+0

Chỉ một điều: đối với những người nhận được lỗi "MS.Internal.Markup.MarkupExtensionParser + UnknowMarkupExtension", đây là giải pháp: http://www.hardcodet.net/2008/04/nested-markup-extension-bug – EdMelo

+0

Vâng, đó là một lỗi gây phiền nhiễu ... Nó không xảy ra nếu ME được định nghĩa trong một hội đồng riêng biệt –

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