You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于IronPython的pyRevit插件开发:WPF资源字典无法找到

解决pyRevit中IronPython加载XAML资源字典找不到的问题

pyRevit的IronPython环境下,WPF XAML的资源路径解析逻辑和常规编译型WPF应用不同——因为没有编译生成的程序集作为资源根目录,XAML里写的相对路径会基于Revit进程的工作目录(而非你的XAML文件所在目录),这就是你无论怎么调整相对路径都找不到资源字典的原因。

下面是两种可行的解决方法:

方法1:脚本中手动用绝对路径加载资源字典

这种方法适合需要复用资源字典的场景,步骤如下:

  1. 修改IronPython加载XAML的脚本,先获取XAML文件的绝对路径,再计算资源字典的绝对路径,最后手动将资源字典合并到窗口资源中。
    示例脚本:
    import os
    from pyrevit import script
    from System.Windows import ResourceDictionary
    from System.Windows.Markup import XamlReader
    from System import Uri
    
    # 获取当前脚本的绝对路径
    script_path = script.get_script_path()
    script_dir = os.path.dirname(script_path)
    
    # 计算资源字典的绝对路径(根据你的实际层级调整)
    resource_dict_path = os.path.abspath(
        os.path.join(script_dir, "../../../../../folder with resource dictionary/xamlStyles.xaml")
    )
    
    # 加载UI.xaml文件
    xaml_file_path = os.path.join(script_dir, "UI.xaml")
    with open(xaml_file_path, 'r', encoding='utf-8') as f:
        xaml_content = f.read()
    window = XamlReader.Parse(xaml_content)
    
    # 加载资源字典并合并到窗口资源
    res_dict = ResourceDictionary()
    res_dict.Source = Uri(resource_dict_path)
    window.Resources.MergedDictionaries.Add(res_dict)
    
    window.ShowDialog()
    
  2. 移除UI.xaml中原本的Window.Resources里的合并字典配置,改为空的资源节点或者直接去掉(如果没有其他资源的话):
    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Topmost="True">
    <Window.Resources>
        <!-- 这里留空或直接移除,由脚本手动添加资源字典 -->
    </Window.Resources>
    <!--Rest of UI below-->
    </Window>
    

方法2:将资源字典内容直接嵌入XAML

如果你的资源字典内容比较简单,不需要跨多个XAML复用,可以直接把资源字典里的样式复制到UI.xaml的Window.Resources中,省去外部文件依赖:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Topmost="True">
<Window.Resources>
    <ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">
        <Border Background="Red"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                CornerRadius="50">
            <ContentPresenter HorizontalAlignment="Center"
                              VerticalAlignment="Center" />
        </Border>
    </ControlTemplate>
</Window.Resources>
<!--Rest of UI below-->
</Window>

内容的提问来源于stack exchange,提问作者DSquad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:28