簡體   English   中英

在不同的UI線程上創建的WPF訪問窗口

[英]WPF Access window created on different UI thread

我在不同的線程上創建了新的Window,因為它具有大量的UI操作,這樣做是為了使主窗口保持平穩運行。 一切正常。

但這是一個問題:
如何訪問新創建的窗口?
調用Dispatcher.Run()我無法再操縱visualisationWindow 我想繼續訪問該新創建的窗口對象。

這是我的窗口的創建方式:

    private void CreateVisualisationWindow()
    {
        Thread VisualisationWIndowThread = new Thread(new ThreadStart(ThreadStartingPoint));
        VisualisationWIndowThread.SetApartmentState(ApartmentState.STA);
        VisualisationWIndowThread.IsBackground = true;
        VisualisationWIndowThread.Start();
    }

    private void ThreadStartingPoint()
    {
        Visualisation visualisationWindow = new Visualisation();
        visualisationWindow.Show();
        System.Windows.Threading.Dispatcher.Run();
    }

我也嘗試通過System.Windows.Threading.Dispatcher.FromThread(VisualisationWIndowThread)訪問它,但似乎我誤解了一些核心內容。

我使用兩個WPF Window對象和一個計時器模擬了您的問題,以確保在調用第二個Window之前創建了第二個Window。 下面是我的代碼示例,它每五秒鍾更新一次第二個Windows TextBox:

    private Timer _timer;
    private SecondWindow _secondWindow;

    public MainWindow()
    {
        InitializeComponent();
        CreateVisualisationWindow();
        _timer = new Timer(Callback);
        _timer.Change(5000, 5000);
    }

    private void Callback(object state)
    {
        UpdateSecondWindowText();
    }

    private void CreateVisualisationWindow()
    {
        Thread VisualisationWIndowThread = new Thread(ThreadStartingPoint);
        VisualisationWIndowThread.SetApartmentState(ApartmentState.STA);
        VisualisationWIndowThread.IsBackground = true;
        VisualisationWIndowThread.Start();
    }

    private void ThreadStartingPoint()
    {
        _secondWindow = new SecondWindow();
        _secondWindow.SecondWindowTextBlock.Text = "Hello";
        _secondWindow.Show();
         Dispatcher.Run();
    }

    private void UpdateSecondWindowText()
    {
        _secondWindow.Dispatcher.BeginInvoke(new Action(() =>
        {
            _secondWindow.SecondWindowTextBlock.Text = _secondWindow.SecondWindowTextBlock.Text + " World";
        }));
    }

因此,訣竅是,您需要在第二個Window上調用Dispatcher才能訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM