2011-04-28 18 views
3

我在XAML中爲SystemColors定義了資源。如果我將Foregroung屬性直接設置到TextBlock,它工作得很好。但是,如果我在樣式中分配前景屬性,則會出現下面顯示的錯誤。我不確定是什麼問題以及如何解決問題。任何想法都非常感謝!無法在Silverlight中的樣式中添加系統顏色?

直接在texblock中設置前景的代碼。它工作正常

<TextBlock Text="WindowTextColor" Foreground="{Binding WindowTextColor, Source={StaticResource SystemColors}, Converter={StaticResource colorConverter}}" /> 

當我通過樣式設置前景屬性時的代碼。我的應用程序崩潰:

<UserControl.Resources> 
    <local:ColorToBrushConverter x:Key="colorConverter" /> 
    <local:SystemColorsWrapper x:Key="SystemColors" /> 
    <Style x:Key="TextBlockStyle1" TargetType="TextBlock"> 
    <Setter Property="Foreground" Value="{Binding WindowColor, Source={StaticResource SystemColors}, Converter={StaticResource colorConverter}}"/> 
    </Style>  
</UserControl.Resources> 

<Grid Background="#FFB8B8B8"> 
    <TextBlock Text="WindowColor" Style="{StaticResource TextBlockStyle1}" />  
</Grid> 

我得到的錯誤:

發生System.Windows.Markup.XamlParseException 消息=設置屬性 '' 引發了異常。 [行:11的位置:41] LineNumber上= 11 LinePosition = 41 堆棧跟蹤: 在System.Windows.Application.LoadComponent(對象部件,烏里resourceLocator) 在SilverlightSysColors.MainPage.InitializeComponent() 在SilverlightSysColors.MainPage。 .ctor() InnerException:System.NotSupportedException Message =無法設置只讀屬性''。 堆棧跟蹤: 在MS.Internal.XamlMemberInfo.SetValue(對象目標,對象的值) 在MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken法菜單,XamlQualifiedObject & inObj,XamlPropertyToken inProperty,XamlQualifiedObject & inValue) 的InnerException:

回答

3

您不能在a Setter中包含綁定。該綁定應用於SetterValueProperty依賴屬性,這不是您的真正意圖。在Xaml解析期間(在綁定可以應用它的值之前)應用樣式會發生什麼情況,這又會導致樣式被封閉。當試圖通過綁定來調整Setter的值時,它會失敗,因爲只有在使用樣式後纔會讀取值。

編輯

一個解決根據我的猜測,動態綁定是不是真的那麼必要你只是想訪問SystemColors靜態類成員的方便手段。我的做法是創建一個ResourceDictionary的衍生產品,以將一組完整的資源帶到SystemColors類中,包括每個屬性的Color和Brush,並相應地命名。反射的一點點幫助: -

public class SystemColorsResources : ResourceDictionary 
{ 
    public SystemColorsResources() 
    { 
     foreach (PropertyInfo pi in typeof(SystemColors).GetProperties()) 
     { 
      Color c = (Color)pi.GetValue(null, null); 
      Add(pi.Name, c); 
      Add(pi.Name.Replace("Color", "Brush"), new SolidColorBrush(c)); 
     } 
    } 
} 

有了這個類在你的應用程序在您MergedDictionaries列表中的App.xaml一個它的實例: -

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <local:SystemColorsResources /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

現在你可以使用系統顏色屬性名稱以其「Brush」變體作爲簡單的靜態資源: -

<UserControl.Resources> 
    <Style x:Key="TextBlockStyle1" TargetType="TextBlock"> 
    <Setter Property="Foreground" Value="{StaticResource WindowBrush}" /> 
    </Style> 
</UserControl.Resources> 

<Grid Background="#FFB8B8B8"> 
    <TextBlock Text="WindowColor" Style="{StaticResource TextBlockStyle1}" /> 
</Grid> 
+0

是否有任何解決方法? – vladc77 2011-04-28 21:57:34

+0

@ vladc77:看看我的編輯工作 – AnthonyWJones 2011-04-29 19:41:13

+0

這是我能找到的最好的工作。非常感謝你分享他的技術。我高度評價它。 – vladc77 2011-05-01 15:56:14