今天,在用wpf制作一个UserControl被其他控件加载调用时遇到了一个问题,现在分享出来,给以后遇到这个问题的人解惑。
问题:就是这里使用了一个自定义控件,该控件中在Load函数采用了后台线程Backgroundworker来刷新UI控件中的数据。具体的代码如下所示:
public partial class ParameterConfig_Alarm : UserControl
{
public ParameterConfig_Alarm()
{
InitializeComponent();
backgroundworker1 = new BackgroundWorker();
backgroundworker1.DoWork += backgroundworker1_DoWork;
}
private void backgroundworker1_DoWork(object sender,DoWorkEventArgs e)
{
//就是这条语句采用了从XML文件的数据来刷新控件数据,这是带参数的方式
alarmFilter1.Dispatcher.Invoke(new Action<string>((string s) => { alarmFilter1.setAlarmlevel(XmlConfig.GetAppConfig(s)); }));
//就是这条语句采用了从XML文件的数据来刷新控件数据,这是不带参数的方式
alarmFilter1.Dispatcher.Invoke(new Action(() => { alarmFilter1.setAlarmType(XmlConfig.GetAppConfig("UPLD_FILTER_ALMTYPE")); }));
alarmFilter1.Dispatcher.Invoke(new Action(() => { alarmFilter1.InsertFilterID(XmlConfig.GetAppConfig("UPLD_FILTER_ALMID")); }));
alarmFilter1.Dispatcher.Invoke(new Action(() => { alarmFilter1.InsertFilterCode(XmlConfig.GetAppConfig("UPLD_FILTER_ALMCODE")); }));
m_setAlmCountColor();
}
private void ParameterConfig_Warn_Load(object sender, RoutedEventArgs e)
{
backgroundworker1.RunWorkerAsync();
}
}
就是上面的这个控件在下面的控件来调用其的时候,会出现无法加载的情况,具体的控件调用XAML代码,如下:
<Controls:MetroWindow x:Class="INMS.MainWindow"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:wf ="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:local="clr-namespace:INMS"
Title="集中网管服务端" Height="1085" Width="1920" WindowState="Maximized">
<Grid>
<local:ParameterConfig_Alarm />
</Grid>
在Grid中调用该UserCOntrol,虽然可以正常运行,但是在动态对页面进行显示的时候,会出现下图所示的问题:
这里主要导致的原因是用户控件中的
alarmFilter1.Dispatcher.Invoke(new Action<string>((string s) => { alarmFilter1.setAlarmlevel(XmlConfig.GetAppConfig(s)); }));
中采用了参数的缘故。
虽然不会导致无法运行,但是会影响后面的设计。具体是什么原因导致的,容我三思。