【问题标题】:MaterialDesign PackIcon issues when using AssemblyResolve使用 AssemblyResolve 时的 MaterialDesign PackIcon 问题
【发布时间】:2019-08-21 03:32:38
【问题描述】:

我正在使用 MaterialDesignInXAML。

程序引用的库太大,构建时会被压缩。

压缩库在程序启动时动态加载。

识别所有库加载成功。 (调试-窗口-模块)

问题出现在这里。

下面是设计代码。

此代码不会引起任何问题。

<Button Style="{StaticResource MaterialDesignFloatingActionButton}" Width="32" Height="32" Content="{materialDesign:PackIcon Kind=Add, Size=24}"/>

Normal Result

但是这段代码会导致问题。

<Button Style="{StaticResource MaterialDesignFloatingActionButton}" Width="32" Height="32">
    <materialDesign:PackIcon Kind="Add" Width="24" Height="24"/>
</Button>

Strange Result

第一个代码结果正常加载图标。但第二个代码结果是图标被重置。

在研究了这个问题后,我认为 MaterialDesignThemes.Wpf 库中存在问题。 但是我一个星期都解决不了这个问题。

静态加载库不会出现问题。

有没有办法解决这个问题??

Example git repository

【问题讨论】:

    标签: c# wpf material-design-in-xaml


    【解决方案1】:

    我终于解决了这个问题。

    问题在于绑定上下文。

    这里是解决方案。

    static Dictionary<string, Assembly> loadedAssemblies = new Dictionary<string, Assembly>();
    
        static Program()
        {
            AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad;
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        }
    
        private static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
        {
            var name = args.LoadedAssembly.FullName.Substring(0, args.LoadedAssembly.FullName.IndexOf(',')) + ".dll";
    
            if (!loadedAssemblies.ContainsKey(name))
                loadedAssemblies.Add(name, args.LoadedAssembly);
        }
    
        private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
    
            if (loadedAssemblies.ContainsKey(name))
                return loadedAssemblies[name];
    
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Count() > 0)
            {
                string resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream != null)
                    {
                        byte[] assembly = new byte[stream.Length];
                        stream.Read(assembly, 0, assembly.Length);
                        Console.WriteLine("Dll file load : " + resourceName);
                        return Assembly.Load(assembly);
                    }
                }
            }
            return null;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2012-04-01
      相关资源
      最近更新 更多