Revit 插件本身只能够单线程运行,理由是确保它的数据一致性。
但不代表不能用多线程干些别的事,例如进度条。
贴上WPF的xaml,使用MVVM制作的窗口,方便设置进度。
命名i 指的是behaviors NuGet里可以搜的到。
<i:Interaction.Behaviors>
<local:WindowBehavior Close="{Binding Close}"/>
</i:Interaction.Behaviors>
<Grid>
<ProgressBar Name="progressBar" Value="{Binding CurNum,Mode=TwoWay}" Maximum="{Binding Max,Mode=TwoWay}" Height="30"
VerticalAlignment="Center" HorizontalAlignment="Center" Width="250"/>
</Grid>
bModel = new PBModel()
{
CurNum = 0,
Max = blockInstances.Count
};
Thread thread = new Thread(() =>
{
PBView pb = new PBView(bModel);
pb.ShowDialog();
});
thread.TrySetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
使用方式如上,修改进度只要修改bModel 的CurNum即可。
public class PBModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private int curNum;
public int CurNum
{
get { return curNum; }
set
{
curNum = value;
RaisePropertyChanged(nameof(CurNum));
}
}
private int max;
public int Max
{
get { return max; }
set
{
max = value;
RaisePropertyChanged(nameof(Max));
}
}
private bool close;
public bool Close
{
get { return close; }
set
{
close = value;
RaisePropertyChanged(nameof(Close));
}
}
}
}
Model中的Close,是为了在完成后自动关闭进度条留下的。
public PBView(PBModel model)
{
DataContext = model;
InitializeComponent();
}
总结:一个简单的进度条,用起来也很方便。转载请标明出处。