如何在使用WPF和IronPython时创建“本地”命名空间?

cngwdvgl  于 2022-12-14  发布在  Python
关注(0)|答案(1)|浏览(182)

我正在尝试创建一个用于WPF xaml的类型转换器。我确保等效的C#代码工作正常,然后将其移植到IronPython中。但是,我在引用xaml中的TC类时卡住了。更具体地说,如何将“local”名称空间指向IronPython全局名称空间?下面是代码,它没有运行,因为xmlns:local="clr-namespace:global"生成错误。

import clr
clr.AddReference("PresentationFramework")
clr.AddReference("PresentationCore")
clr.AddReference("System.Xml")
from System.Xml import XmlReader
from System.IO import StringReader
from System.Windows.Markup import XamlReader
from System.Windows.Data import IValueConverter
from System.Windows import Visibility

class tc(IValueConverter):
    def Convert(value, targetType, parameter, culture):
        if value:
            return Visibility.Visible
        else:
            return Visibility.Collapsed

    def ConvertBack(value, targetType, parameter, culture):
        pass

s = XmlReader.Create(StringReader('''
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        
        mc:Ignorable="d"
        xmlns:local="clr-namespace:global"  
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:tc x:Key="tc" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <CheckBox x:Name="checkbox" IsChecked="True" Content="Visible" Grid.Column="0"/>
        <Button Visibility="{Binding ElementName=checkbox, Path=IsChecked, Converter={StaticResource tc}}" Content="Button" Height="20" Grid.Column="1"/>
    </Grid>
</Window>
'''))

win = XamlReader.Load(s)
win.ShowDialog()
kmb7vmvb

kmb7vmvb1#

几年后我遇到了同样的事情,我怀疑我可能是在为同样的软件环境编写插件。
由于我也无法将转换器转换为IronPython,我最终通过以下方式进行了类似的处理:
1.添加在第一个属性更新时触发的函数
1.在此函数中,基于第一个属性的值更新第二个属性
例如:

  • 在XAML中 *
<CheckBox  
   x:Name="myCheckbox"
   IsChecked="{Binding Lock, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
   Click="Refresh"/>
<Button x:Name="myButton" ... />
  • Python皮 *
class MainWindow(Windows.Window):
   ...
   def Refresh(self, sender, args):
      if self.myCheckbox.IsChecked:
         self.myButton.Visibility = Visibility.Visible
      else:
         self.myButton.Visibility = Visibility.Collapsed
   ...

这有点粗糙-我需要在其中执行此操作的确切UI与您描述的UI有点不同,因此我更改Visibility的语法可能有点错误。

相关问题