【问题标题】:local resource added doesn't show up in WPF page添加的本地资源未显示在 WPF 页面中
【发布时间】:2016-01-14 22:04:38
【问题描述】:

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

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

我已在Page 级别中正确包含命名空间WindowsSampleApplication,并且相同的命名空间具有我的资源的定义。但是当添加local resource时,我会低于error

我刚刚开始使用来自 hereWPF 教程,但我唯一尝试而不是遵循教程的是我添加了一个 页面 而不是 Window,因为我已经创建了一个Window,并在那里提供了早期的演示,希望我已经转换了 Page 所需的所有内容,而不是 Window。有人知道如何解决这个问题吗?

更新

我也尝试过将&lt;local..../&gt;&lt;ResourceDictionary&gt; 包装在一起,因为我在 SO 中准备好了它,但没有多大用处,错误仍然存​​在。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    由于您似乎只是在尝试 WPF,并且没有特殊原因将转换器放入代码隐藏中,因此我建议您使用通常的方法来创建转换器:

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

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

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

    【讨论】:

    • 是的,谢谢您.. 问题有所不同.. 感谢您提出新想法.. :) +1 为此..
    【解决方案2】:

    我认为您的问题是您已将转换器嵌套在 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";
            }
        }
    }
    

    【讨论】:

    • 那么它说 不支持嵌套属性.. :(
    • 啊,我的错!您根本不能使用嵌套类。只需尝试直接在 WindowsSampleApplication 命名空间内声明转换器。应该可以,我会修改我的答案
    • Buddy.. 那是实际的答案.. 我在 ValueConverter 中放错了转换器类。他们在DEMO中给出了正确的答案。它实际上应该在外面..刚才我也找到了..请更新答案,我会接受它... :) 感谢您的时间..
    • 更新你的答案有点详细.. :)
    【解决方案3】:

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

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

    链接:

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

    【讨论】:

    • 感谢您的宝贵时间.. 我建议让解释简短而甜蜜,即只了解重点,然后提供来源.. :) 无论如何.. +1 为您的时间.. :)
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多