如何访问 ActivityDesigner 中的 activity 参数?
How to access activity Argument within ActivityDesigner?
我需要在 ActivityDesigner
.
获取自定义 activity 的 InArgument
值
我的Activity:
[Designer(typeof(ReadTextDesigner))]
public sealed class ReadText : CodeActivity
{
public InArgument<string> ImageName { get; set; }
protected override void Execute(CodeActivityContext context)
{
}
}
我的设计师:
public partial class ReadTextDesigner
{
public ReadTextDesigner()
{
InitializeComponent();
//this.ModelItem is null here.. WHY is it null?
//How do I get Activity's ImageName here?
}
}
我也有一个按钮,如下图所示,当你点击它时,我 可以设置 我的自定义 Activity 值,如下所示:
private void BtnStart_OnClick(object sender, RoutedEventArgs e)
{
this.ModelItem?.Properties["ImageName"]?.SetValue(new InArgument<string>()
{
Expression = "some value"
});
}
XAML:
<sapv:ExpressionTextBox
Expression="{Binding Path=ModelItem.ImageName, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
ExpressionType="s:String"
HintText="Enter a string"
OwnerActivity="{Binding Path=ModelItem}"
Width="110"
Margin="0,5"
Grid.Row="0"
MaxLines="1"
x:Name="TxtImagePath"/>
<Button Grid.Column="0" Grid.Row="1" Content="Get Image" HorizontalAlignment="Center" Click="BtnStart_OnClick" x:Name="BtnStart"/>
如何获取 Activity InArgument ReadTextDesigner
构造函数?
这很奇怪,但我找到了解决方法。虽然这是 A 解决方案,但我希望有一个更好的解决方案;
由于在构造函数中,我无法获取 ModelItem
,我在主线程之外创建了一个新的 Thread
。这个新线程等待 2 毫秒,然后尝试获取 ModelItem
并以某种方式成功。
这里是新修改的ReadTextDesigner
代码(注:我只改了ReadTextDesigner
代码,没有其他)
public ReadTextDesigner()
{
InitializeComponent();
new TaskFactory().StartNew(() => { this.Dispatcher.Invoke(() => SetImage(this)); });
}
private void SetImage(ReadTextDesigner designer)
{
Thread.Sleep(2);
if (designer.ModelItem.GetCurrentValue() is ReadText readText)
{
var imageName = readText.ImageName?.Expression?.Convert<string>();
if (!string.IsNullOrWhiteSpace(imageName))
{
//imageName has a value at this point!
}
}
}
ModelItem
不再为 null 并带有必要的值。
希望这会帮助某人或某人 post 更好的解决方案。
干杯!
我需要在 ActivityDesigner
.
InArgument
值
我的Activity:
[Designer(typeof(ReadTextDesigner))]
public sealed class ReadText : CodeActivity
{
public InArgument<string> ImageName { get; set; }
protected override void Execute(CodeActivityContext context)
{
}
}
我的设计师:
public partial class ReadTextDesigner
{
public ReadTextDesigner()
{
InitializeComponent();
//this.ModelItem is null here.. WHY is it null?
//How do I get Activity's ImageName here?
}
}
我也有一个按钮,如下图所示,当你点击它时,我 可以设置 我的自定义 Activity 值,如下所示:
private void BtnStart_OnClick(object sender, RoutedEventArgs e)
{
this.ModelItem?.Properties["ImageName"]?.SetValue(new InArgument<string>()
{
Expression = "some value"
});
}
XAML:
<sapv:ExpressionTextBox
Expression="{Binding Path=ModelItem.ImageName, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
ExpressionType="s:String"
HintText="Enter a string"
OwnerActivity="{Binding Path=ModelItem}"
Width="110"
Margin="0,5"
Grid.Row="0"
MaxLines="1"
x:Name="TxtImagePath"/>
<Button Grid.Column="0" Grid.Row="1" Content="Get Image" HorizontalAlignment="Center" Click="BtnStart_OnClick" x:Name="BtnStart"/>
如何获取 Activity InArgument ReadTextDesigner
构造函数?
这很奇怪,但我找到了解决方法。虽然这是 A 解决方案,但我希望有一个更好的解决方案;
由于在构造函数中,我无法获取 ModelItem
,我在主线程之外创建了一个新的 Thread
。这个新线程等待 2 毫秒,然后尝试获取 ModelItem
并以某种方式成功。
这里是新修改的ReadTextDesigner
代码(注:我只改了ReadTextDesigner
代码,没有其他)
public ReadTextDesigner()
{
InitializeComponent();
new TaskFactory().StartNew(() => { this.Dispatcher.Invoke(() => SetImage(this)); });
}
private void SetImage(ReadTextDesigner designer)
{
Thread.Sleep(2);
if (designer.ModelItem.GetCurrentValue() is ReadText readText)
{
var imageName = readText.ImageName?.Expression?.Convert<string>();
if (!string.IsNullOrWhiteSpace(imageName))
{
//imageName has a value at this point!
}
}
}
ModelItem
不再为 null 并带有必要的值。
希望这会帮助某人或某人 post 更好的解决方案。
干杯!