[英]local resource added doesn't show up in WPF page
我有一个简单的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";
}
}
}
}
我已经在Page
级别正确包含名称空间WindowsSampleApplication
,并且相同的名称空间为我的资源定义了。 但是添加该local resource
时出现以下error
我刚刚从这里开始学习WPF
教程,但是我只是尝试而不是按照教程学习的是添加页面而不是窗口,因为我已经创建了一个带有早先演示的Window
,并且希望我已经转换了页面所需的一切代替Window 。 有人对如何解决此问题有想法吗?
更新
我还在SO中准备好使用<ResourceDictionary>
包装<local..../>
时,但是并没有太大用处,并且仍然保持错误。
由于看起来您只是在尝试WPF,并且出于特殊原因将转换器放在代码后方,因此我建议使用通常的创建转换器的方法:
在您的WindowsSampleApplication项目中创建一个新目录Converters 。 然后为每个转换器添加一个新的类文件...
现在,您知道在哪里可以找到转换器,并且可以轻松地重用它们。
PS:可以将转换器作为嵌套类放在代码背后,但是您应该有一个很好的理由。 ( 将转换器绑定为内部类吗? )
我认为您的问题是您已将转换器嵌套在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";
}
}
}
您需要直接在名称空间中声明YesNoToBooleanConverter
。 从MSDN:WPF的XAML和自定义类
您的自定义类必须是公共的,并支持默认(无参数)公共构造函数。 (有关结构的注释,请参阅以下部分。)您的自定义类不得为嵌套类。 嵌套类和常规CLR使用语法中的“点”会干扰其他WPF和/或XAML功能(例如附加属性)。
链接:
https://msdn.microsoft.com/zh-CN/library/ms753379(v=vs.100).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.