2016-12-09 48 views
0

我在模板中使用DynamicResource,並且StaticResourceExtensions作爲使用該模板的每種樣式內的資源,因此DynamicResource在每個樣式中的評估方式都不相同。在Style.Resources中使用StaticResourceExtension時出錯

的問題是,我得到這個錯誤:

Unable to cast object of type 'System.Windows.Media.Effects.DropShadowEffect' to type 'System.Windows.ResourceDictionary' 

這裏是我的代碼:

<DropShadowEffect 
    x:Key="Sombra" 
    Opacity="0.5" 
    ShadowDepth="3" 
    BlurRadius="5" 
/> 

<ControlTemplate 
    x:Key="ControleGeometriaTemplate" 
    TargetType="{x:Type Control}" 
> 
    <Border 
     x:Name="border" 
     Background="{TemplateBinding Background}" 
     Width="{TemplateBinding Width}" 
     Height="{TemplateBinding Height}" 
    /> 
     <Path 
      x:Name="ícone" 
      Fill="{TemplateBinding Foreground}" 
      Effect="{DynamicResource PathShadow}" 
     /> 
    </Border> 
</ControlTemplate> 

<Style x:Key="BotãoGeometria" TargetType="{x:Type ButtonBase}"> 
    <Setter Property="Template" Value="{StaticResource ControleGeometriaTemplate}"/> 
</Style> 

<Style 
    x:Key="BotãoNavegaçãoBase" 
    TargetType="{x:Type ButtonBase}" 
    BasedOn="{StaticResource BotãoGeometria}" 
> 
    <Style.Resources> 
     <StaticResource x:Key="PathShadow" ResourceKey="Sombra"/> 
    </Style.Resources>  
</Style> 
+0

它編譯?這看起來像是那些在資源查找中傾向於發生的僅限於設計視圖的錯誤。 –

+0

當我在VisualStudio中通過點擊'F5'來運行應用程序時,我得到一個XamlParseError ...:o(所以是的,它編譯,但是不運行 – heltonbiker

+0

因此,在頂部註釋到的內部異常'XamlParseError'還是其他的錯誤? –

回答

2

據我所知StaticResourceExtensionsome situations正常工作。

它聞起來就像你發現了類似的情況:

<SolidColorBrush x:Key="RedBrush" Color="Red" /> 
<Style TargetType="TextBox" x:Key="Test"> 
    <Style.Resources> 
     <StaticResourceExtension x:Key="NewRedBrushKey" ResourceKey="RedBrush" /> 
    </Style.Resources> 
</Style> 

使用Test風格在你Window足以重現您的問題。

所以我的建議是使用自己的分機:

public class ResourceFinder : System.Windows.Markup.MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     FrameworkElement frameworkElement; 
     IDictionary dictionary; 
     IRootObjectProvider rootObjectProvider = (IRootObjectProvider) 
      serviceProvider.GetService(typeof(IRootObjectProvider)); 

     if (rootObjectProvider != null) 
     { 
      dictionary = rootObjectProvider.RootObject as IDictionary; 

      if (dictionary != null) 
      { 
       return dictionary[ResourceKey]; 
      } 
      else 
      { 
       frameworkElement = rootObjectProvider.RootObject as FrameworkElement; 
       if (frameworkElement != null) 
       { 
        return frameworkElement.TryFindResource(ResourceKey); 
       } 
      } 

     } 

     return null; 
    } 


    public object ResourceKey 
    { 
     get; 
     set; 
    } 
} 

然後你的風格將變爲:

<Style 
    x:Key="BotãoNavegaçãoBase" 
    TargetType="{x:Type ButtonBase}" 
    BasedOn="{StaticResource BotãoGeometria}"> 
    <Style.Resources> 
     <local:ResourceFinder x:Key="PathShadow" ResourceKey="Sombra" /> 
    </Style.Resources> 
</Style> 

我希望這可以幫助您解決問題。

+0

感謝您的回答!任何提示爲什麼這是有效的,原來的情況沒有?這種解決方法實際上繞過了什麼樣的錯誤行爲?我問,因爲我不想使用解決方案而不知道它爲什麼以及如何工作...... – heltonbiker

+0

Hi @ heltonbiker,the 'StaticResourceExtension'有自己的工作方式(你可以使用[ILSpy](http://ilspy.net/)來查看它的代碼),它使用不同的服務('IXamlSchemaContextProvider'和'IAmbientProvider',而不是我的鱈魚e使用'IRootObjectProvider')。我只是使用了一種適用於這種情況的不同方法。 –

0

很確定這是一個BAML編譯相關的錯誤。如果在運行時使用XamlReader.Parse動態編譯代碼,則代碼將起作用。我想這也可以用作解決方法。