VS無法正常載入Wpf後臺重新整理ui的自定義控制元件
阿新 • • 發佈:2019-02-18
今天,在用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)); }));
中採用了引數的緣故。
雖然不會導致無法執行,但是會影響後面的設計。具體是什麼原因導致的,容我三思。