1. 程式人生 > >VS無法正常載入Wpf後臺重新整理ui的自定義控制元件

VS無法正常載入Wpf後臺重新整理ui的自定義控制元件

今天,在用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)); }));

中採用了引數的緣故。
雖然不會導致無法執行,但是會影響後面的設計。具體是什麼原因導致的,容我三思。