Error when using StaticResourceExtension inside Style.Resources

前端 未结 2 1077
情歌与酒
情歌与酒 2020-12-20 08:59

I am using DynamicResource in a template, and StaticResourceExtensions as resource inside each style using that template, so that the DynamicResource is evaluated differentl

相关标签:
2条回答
  • 2020-12-20 09:07

    As far as I know StaticResourceExtension does not work properly in some situations.

    It smells like you found a similar situation:

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

    Using the Test style in your Window is enough to reproduce your issue.

    So my suggestion is to use your own extension:

    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;
        }
    }
    

    Then your style will become:

    <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>
    

    I hope this can help you with your issue.

    0 讨论(0)
  • 2020-12-20 09:11

    Pretty sure this is a BAML compilation related bug. The code will work if compiled dynamically at run time using XamlReader.Parse. This could be used as a workaround as well, i suppose.

    0 讨论(0)
提交回复
热议问题