我想念什么?我试图将转换器实现为基于XAML的PowerShell脚本,但是没有运气。 我已经从StackOverflow之类的网站上获取了一些信息。但在基于Powershell XAML的GUI脚本中找不到转换器的成功实现。
在我正在测试转换器的代码中,它可以工作(您可以看到2个转换示例),这意味着Powershell本身接受了新的转换器类型,因此无法在我的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
#Checking that the new type works and convert is done...
$c = new-object MyProject.DemoConverter
$c.Convert("gg", $null, $null, $null)
$c.Convert(55, $null, $null, $null)
#Now declaring and loading the 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" >
<Window.Resources>
<cnv:DemoConverter x:Key="TestConverter" />
</Window.Resources>
<Grid>
<TextBox x:Name="txtTestValue" Text="I'm here to show that xaml loading works!" />
</Grid>
</Window>
'@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )
$Window.ShowDialog() | out-null
我不断收到此错误:
使用“ 1”参数调用“ Load”的异常:“无法创建未知类型'{clr-namespace:MyProject} DemoConverter'。”
如果我删除以下行:<cnv:DemoConverter x:Key="TestConverter" />
它不会给出上述错误,并且会显示窗口(但是,当然,xaml中的转换将不可用),所以我想我在XAML不喜欢的名称空间和/或程序集减速方面做错了事。 / p>
请注意,在我的xaml上,我尚未使用转换器。我只想在尝试使用转换器之前克服上述错误。
非常感谢您!
答案 0 :(得分:0)
我注册了Stackoverflow只是为了参加这个问题。
在我在这里遇到这个问题之前,我搜索了HOURS来解决此问题,然后我的希望破灭了,因为它已经在这里呆了将近一年了,没有答案。
我早些时候找到了这个相关的问题,它提供了我们正在尝试解决的基本解决方案,但是没有给出使其真正起作用的任何细节。 How to use IValueConverter from powershell?
幸运的是,经过几个小时,然后将许多其他信息汇总在一起,我终于解决了!
有3件。
因此,请参阅我发布的更新代码,其中包含以下更改。如原始海报所示,此示例未显示转换器的实际运行情况,但脚本至少将运行并显示该表单而不会出现错误,表明该表单本身已接受TextBox中的转换器定义和用法。
代码
$src = @'
using System;
using System.Windows;
using System.Windows.Data;
using System.Globalization;
namespace MyConverter
{
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
#Checking that the new type works and convert is done...
$c = new-object MyConverter.DemoConverter
$AssemblyName = $c.gettype().Assembly.FullName.Split(',')[0]
#$c.Convert("gg", $null, $null, $null)
#$c.Convert(55, $null, $null, $null)
#Now declaring and loading the xaml
$inputXML = @'
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Converter="clr-namespace:MyConverter;assembly=myassembly"
xmlns:cnv="clr-namespace:MyProject" >
<Window.Resources>
<Converter:DemoConverter x:Key="TestConverter" />
</Window.Resources>
<Grid>
<TextBox x:Name="txtTestValue" Text="I'm here to show that xaml loading works!" />
<TextBox x:Name="txtTestValue2" Text="{Binding Path=Whatever, Converter={StaticResource TestConverter}}" />
</Grid>
</Window>
'@
[xml]$XAML = $inputXML -replace 'myassembly', $AssemblyName
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )
$Window.ShowDialog() | out-null