添加的本地资源未显示在WPF页面

时间:2016-01-14 13:22:53

标签: c# wpf

我有这个简单的WPF页面,我在其中添加了一个本地资源,它的定义在Page的后端文件中。

<Page x:Class="WindowsSampleApplication.ValueConverter"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WindowsSampleApplication"
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"
    Title="ValueConverter">
    <Page.Resources>
        <local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
    </Page.Resources>

    <Grid>
        <StackPanel Margin="10">
            <TextBox Name="txtValue" />
            <WrapPanel Margin="0,10">
                <TextBlock Text="Current value is: " />
                <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
            </WrapPanel>
            <CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
        </StackPanel>
    </Grid>
</Page>

这是Page

的后端文件
namespace WindowsSampleApplication
{
    public partial class ValueConverter : Page
    {
        public ValueConverter()
        {
            InitializeComponent();
        }
        public class YesNoToBooleanConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                switch (value.ToString().ToLower())
                {
                    case "yes":
                        return true;
                    case "no":
                        return false;
                }
                return false;
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value is bool)
                {
                    if ((bool)value == true)
                        return "yes";
                    else
                        return "no";
                }
                return "no";
            }
        }
    }
}

我在WindowsSampleApplication级别中正确包含了名称空间Page,并且相同的名称空间具有我的资源的定义。但是在添加error

后,我的价格低于local resource

Error Image

我刚刚开始使用 here 中的WPF教程,但我只是尝试而不是按照教程进行了添加页面而不是 Window ,因为我已经在那里创建了Window早期演示,并希望我已经转换了 Page 需要的所有内容而不是窗口即可。有人知道如何解决这个问题吗?

更新

我还尝试用<local..../>封装<ResourceDictionary>,因为我在SO中准备好它,但没有多大用处,错误仍然存​​在。

3 个答案:

答案 0 :(得分:3)

因为看起来你只是在试用WPF,并且你没有特殊原因将转换器放在代码隐藏中,我会建议创建转换器的常用方法:

在WindowsSampleApplication项目中创建新目录 Converters 。然后为每个转换器添加一个新的类文件......

现在您知道在哪里可以找到转换器,并且可以轻松地重复使用它们。

PS:可以将转换器作为嵌套类放在代码隐藏中,但是你应该有充分的理由去做。 (Binding converter as inner class?

答案 1 :(得分:1)

我认为您的问题是您已将转换器嵌套在ValueConverter页面内。

[编辑]

不可能实例化嵌套类,因此唯一的选择是直接在WindowsSampleApplication命名空间中声明转换器类。

更新了代码

namespace WindowsSampleApplication
{
    public partial class ValueConverter : Page
    {
        public ValueConverter()
        {
            InitializeComponent();
        }
        //Removed from here
    }
    public class YesNoToBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            switch (value.ToString().ToLower())
            {
                case "yes":
                case "oui":
                    return true;
                case "no":
                case "non":
                    return false;
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                if ((bool)value == true)
                    return "yes";
                else
                    return "no";
            }
            return "no";
        }
    }
}

答案 2 :(得分:1)

您需要直接在命名空间中声明YesNoToBooleanConverter。 从MSDN:WPF的XAML和自定义类

您的自定义类必须是公共的,并且支持默认(无参数)公共构造函数。 (有关结构的说明,请参阅以下部分。) 您的自定义类不能是嵌套类。嵌套类和一般CLR使用语法中的“点”会干扰其他WPF和/或XAML功能,例如附加属性。

链接:

  

https://msdn.microsoft.com/en-us/library/ms753379(v=vs.100).aspx