zoukankan      html  css  js  c++  java
  • 2018-8-10-win10-uwp-x_Bind-无法获得资源

    title author date CreateTime categories
    win10 uwp x:Bind 无法获得资源
    lindexi
    2018-08-10 19:17:19 +0800
    2018-2-13 17:23:3 +0800
    Win10 UWP

    本文告诉大家,如果在 使用 x:Bind 转换器写在资源,而运行出现找不到资源的错误,如果解决。 在运行的时候,出现System.Runtime.InteropServices.COMException Cannot find a resource with the given key

    这个问题就是资源寻找路径问题,因为 Binding 是性能比较差,他的资源是从他的自己,如果找不到,就到他的上一级,直到找到或没有。但是 x:bind 的资源寻找和 Bind 不同,他是在元素的最顶级元素和应用资源寻找。假如有一个用户控件 Foo ,那么打开他的代码,可以看到这样的代码

    public global::Windows.UI.Xaml.Data.IValueConverter LookupConverter(string key)
    {
        if (this.localResources == null)
        {
            global::Windows.UI.Xaml.FrameworkElement rootElement;
            this.converterLookupRoot.TryGetTarget(out rootElement);
            this.localResources = rootElement.Resources;
            this.converterLookupRoot = null;
        }
        return (global::Windows.UI.Xaml.Data.IValueConverter) (this.localResources.ContainsKey(key) ? this.localResources[key] : global::Windows.UI.Xaml.Application.Current.Resources[key]);
    }

    这就是说,元素资源从根元素找。页面的根元素就是页面本身,用户控件就是他自己本身,可以打开一个 xaml 页面,看到的第一个标签就是根元素。如果无法找到资源,会在应用资源寻找,如果找不到,就报错 System.Runtime.InteropServices.COMException 。应用资源是写在 App.xaml 的资源,所以如果希望使用x:bind可以获得资源,或者把资源写在根元素,或者写在应用。

    假如有元素 Slider 他需要资源转换器,那么转换器需要在哪定义,请看下面的代码

                     <Slider Margin="10,10,10,10" Value="{x:Bind xx,Mode=TwoWay,Converter={StaticResource Convert}}" >
                            <Slider.Resources>
                                <local:DoubleConvert x:Name="Convert"></local:DoubleConvert>
                            </Slider.Resources>
                        </Slider>

    这样写运行会错误,说未指定,因为资源找不到,因为资源寻找不是从元素开始寻找,他是从最顶级元素开始,所以如果让上面的代码可以运行,需要把资源定义在顶级元素。上面的代码可以做修改,让他可以运行

        <UserControl.Resources>
            <local:DoubleConvert x:Name="Convert"></local:DoubleConvert>
        </UserControl.Resources>
            <Slider Margin="10,10,10,10" Value="{x:Bind xx,Mode=TwoWay,Converter={StaticResource Convert}}" >
                         
             </Slider>
    

    或者把资源写在 app.xaml 也是可以,但是写在这里的资源不会回收,会一直在内存。如果在这里写很多资源,启动速度会很慢。

    win10 uwp 后台获取资源

    参见:https://stackoverflow.com/a/39735867/6116637

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086351.html
Copyright © 2011-2022 走看看