如何在ActivityDesigner构造函数中获取自定义活动的InArgument值
解决ActivityDesigner构造函数中获取自定义活动InArgument值的问题
首先得明确你遇到的核心问题原因:
WF设计器的初始化流程是先执行设计器的构造函数完成控件初始化,之后才会把对应的活动实例绑定到设计器的
ModelItem属性上。所以在构造函数执行时,ModelItem还未被赋值,自然是null。
解决方案:通过Loaded事件获取ModelItem
你需要等到设计器完全加载完成后再访问ModelItem,最直接的方式就是订阅设计器的Loaded事件,在事件处理方法中完成InArgument的获取操作。
修改你的ReadTextDesigner代码如下:
using System.Activities; using System.Windows; public partial class ReadTextDesigner { public ReadTextDesigner() { InitializeComponent(); // 订阅Loaded事件,等待设计器加载完成后再操作ModelItem Loaded += ReadTextDesigner_Loaded; } private void ReadTextDesigner_Loaded(object sender, RoutedEventArgs e) { if (ModelItem == null) return; // 获取ImageName对应的InArgument<string>实例 var imageNameArg = ModelItem.Properties["ImageName"].GetValue() as InArgument<string>; if (imageNameArg == null) return; // 分两种情况处理InArgument的值:字面量 和 表达式 if (imageNameArg.Expression is Literal<string> literal) { // 如果是直接设置的字面量值(比如"test.jpg") string literalValue = literal.Value; // 这里可以根据需求使用该值,比如同步到控件或做自定义逻辑 // TxtImagePath.Text = literalValue; } else { // 如果是动态表达式(比如绑定到工作流变量`[MyImageVar]`) string expressionText = WorkflowInspectionServices.GetExpressionText(imageNameArg); // 处理表达式文本,比如展示到界面 // TxtImagePath.Text = expressionText; } } }
补充细节说明
- 命名空间引用:确保项目引用了
System.Activities命名空间,WorkflowInspectionServices类依赖它来解析表达式文本。 - InArgument的两种形态:WF中的
InArgument支持两种赋值方式——直接字面量值、动态表达式(变量绑定、复杂表达式),所以需要区分处理。 - 你的XAML已经通过
ExpressionTextBox和ModelItem.ImageName做了双向绑定,控件会自动同步InArgument的值,如果你只是需要展示值,无需手动设置;但如果要实现自定义逻辑(比如根据值触发其他操作),就可以用上面的代码获取对应的值。
内容的提问来源于stack exchange,提问作者E-A
相关产品推荐
相关产品推荐

