2016-12-09 20 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

キャスト例外が内部の例外の先頭に記載されています –

答えて

2

私の知る限りStaticResourceExtensionsome situationsで正しく動作しません知っています。あなたのWindow

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

Testスタイルを使用して、あなたの問題を再現するのに十分です:あなたが似たような状況を発見したよう

それはにおいがします。

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

こんにちは@heltonbiker、 'StaticResourceExtension'は独自の方法で動作します(あなたは[ILSpy](http://ilspy.net/)を使ってそのコードを見ることができます)、別のサービス(' IXamlSchemaContextProvider'と 'IAmbientProvider'、 eは 'IRootObjectProvider'を使用します)。私は単にこの状況で動作する別のアプローチを使用しました。 –

0

これはBAMLコンパイル関連のバグですか?コードはXamlReader.Parseを使用して実行時に動的にコンパイルされた場合に機能します。これは回避策としても使用することができます。

関連する問題