PowerShell XAML GUI脚本实现IValueConverter时遇错误求助
解决PowerShell XAML中无法加载自定义IValueConverter的问题
兄弟,我完全懂你的痛苦!你已经把转换器的逻辑写对了,甚至测试过实例化和转换都没问题,就是XAML死活找不到这个类型对吧?其实问题出在XAML加载器不知道去哪里找你用Add-Type动态生成的程序集。
问题根源
你用Add-Type生成的DemoConverter类型,是存在PowerShell临时创建的动态程序集里的。而你原来的XAML命名空间声明只写了clr-namespace:MyProject,没有指定程序集名称,XAML加载器根本不知道要去哪个程序集里找这个类型,所以才会抛出Cannot create unknown type的错误。
解决方案:明确指定程序集名称
只需要两步就能搞定:
- 获取动态生成的程序集名称
- 修改XAML的命名空间声明,加上程序集信息
修改后的完整代码
$src = @' using System; using System.Windows; using System.Windows.Data; using System.Globalization; namespace MyProject { public class DemoConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) { return "kuku"; } else { return "bobo"; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value; } } } '@ Add-Type -AssemblyName PresentationFramework Add-Type -TypeDefinition $src -ReferencedAssemblies PresentationFramework # 确认转换器工作正常(保留你的验证步骤) $c = New-Object MyProject.DemoConverter $c.Convert("gg", $null, $null, $null) $c.Convert(55, $null, $null, $null) # 获取动态生成的程序集名称 $assemblyName = (Get-Type MyProject.DemoConverter).Assembly.GetName().Name # 构建XAML,用双引号字符串替换程序集名称变量 [xml]$XAML = @" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cnv="clr-namespace:MyProject;assembly=$assemblyName" > <Window.Resources> <cnv:DemoConverter x:Key="TestConverter" /> </Window.Resources> <Grid> <TextBox x:Name="txtTestValue" Text="I'm here to show that xaml loading works!" /> <!-- 加个TextBlock直观测试转换器效果 --> <TextBlock Text="{Binding ElementName=txtTestValue, Path=Text, Converter={StaticResource TestConverter}}" Margin="0,50,0,0" FontSize="16" /> </Grid> </Window> "@ $reader = New-Object System.Xml.XmlNodeReader $XAML $Window = [Windows.Markup.XamlReader]::Load($reader) $Window.ShowDialog() | Out-Null
为什么这样有效?
我们在XAML的命名空间声明里加上了;assembly=$assemblyName,相当于明确告诉XAML加载器:MyProject命名空间下的类型,在这个动态生成的程序集里。而这个程序集已经被PowerShell加载到内存中了,所以加载器能精准定位到DemoConverter类型。
运行代码后,你会看到新增的TextBlock显示"bobo",这说明转换器已经正常工作了!
内容的提问来源于stack exchange,提问作者avic
相关产品推荐
相关产品推荐

