• WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常


    在“System.Windows.StaticResourceExtension”上提供值时引发了异常

    因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错。编译的时候没事,运行阶段就异常。

    难道是转换器写错啦?断点调试,发现根本还没运行到转换器代码。仔细一看,系统报的是XAML解释的错,就纯粹是页面这里的问题。

    页面代码是这样的:

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:cvt="clr-namespace:Converters"
        IsEnabled="{Binding HasShowedUser,Converter={StaticResource cvtBool},Mode=OneWay}">
    
        <Window.Resources>
            <cvt:GenericTypeConverter x:Key="cvtBool"/>
        </Window.Resources>
    
        <Grid>
            <Button x:Name="btnShowUser" Content="秀一下" Height="50" Width="100" Click="btnShow_Click"  />
        </Grid>
    
    </Window>


    寻寻觅觅,冷冷清清凄凄惨惨戚戚,百撕不得骑姐。

    后来将 
    IsEnabled="{Binding HasShowedUser,Converter={StaticResource cvtBool},Mode=OneWay}">
    这一句从<Window> 移到 <Button>里,结果一切正常。

    这说明,之前的错误是因为资源声明在后,而我的调用在前,因此报错了。

    怎么办?难道<Window>就不能使用了吗?

    解决方法是:将资源声明放到一个独立的XAML文件里,比如起名叫 StaticResources.xaml,然后,在App.xaml里包含这个StaticResources.xaml,最后在窗体就可以正常使用这些资源了。

    StaticResources.xaml

    <ResourceDictionary 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cvt="clr-namespace:Converters"
        >
    
        <cnvtrs:GenericTypeConverter x:Key="cvtBool" />
    
    </ResourceDictionary>

    app.xaml

    <Application 
        x:Class="My.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        StartupUri="TestWindow.xaml">
    
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
    		<ResourceDictionary Source="Styles.xaml"/>
                    <ResourceDictionary Source="StaticResources.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>

    调用窗体

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        IsEnabled="{Binding HasShowedUser,Converter={StaticResource cvtBool},Mode=OneWay}">
    
        <Grid>
            <Button x:Name="btnShowUser" Content="秀一下" Height="50" Width="100" Click="btnShow_Click"  />
        </Grid>
    
    </Window>




  • 相关阅读:
    原来触发器不是单行数据触发
    C#-Json-抽象类的反序列化
    vs项目模板创建和使用
    c#-Json-Json字符串字段递归排序
    C# 递增操作符 ++ --
    C# in 参数修饰符
    C# 改变控制台背景颜色
    第一篇不知道说什么
    爬取性感小姐姐
    windows + Eclipse 汉化
  • 原文地址:https://www.cnblogs.com/leftfist/p/4257922.html
Copyright © 2020-2023  润新知