2010-10-08 37 views
0

之外創建獨立的I類有形式WPF應用程序,其具有一個名爲「txtStatusWindow」文本框。我還有一個vb.net類,由一名合作者交給我,需要在我的應用程序代碼中調用並由代碼執行。我的同事堅持認爲我需要使用常見的.net事件來更新我的表單上的文本框。WPF和VB.net:數據綁定到表達混合

單獨vb.net類:

Public Class globalclass 

Public Event txtStatusWindow(ByVal Text As String) 


Public Sub InitializeProgram() 
    RaiseEvent txtStatusWindow("Updating something.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something else.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something other than else.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something other than the else stuff.") 
    System.Threading.Thread.Sleep(2000) 
End Sub 

End Class 

我需要能夠從我的代碼隱藏調用子「InitializeProgram()」,它需要能夠更新「txtStatusWindow.text 「當它運行。

我告訴他,文本框的更新可以通過數據綁定來完成,但是我不知道如何將這樣一個單獨的類集成到我的項目中,如何調用它的方法,或者如何導致它通過數據綁定更新我的文本塊。

我還建議,在這個類中的方法不適合用來連接到WPF項目反正,但他只是寫了它作爲一個例子來探索如何將兩個項目連接起來。

最後,我將需要集成類,如這些將運行單獨的線程從動態源更新他們的數據,並導致許多控制在我的應用程序更新。

到目前爲止,我們已經能夠得到這個從我的代碼隱藏的唯一方法是這樣的:

Partial Public Class SplashScreen 

Dim NewText as String 

    Public WithEvents Globals As globalclass = New globalclass 
    Public Delegate Sub StringDelegate(ByVal Text As String) 
    Public SplashText As String 

Public Sub New() 
    MyBase.New() 
    Me.InitializeComponent() 
    Me.Show() 
    Globals.InitializeProgram() 

End Sub 

Public Sub UpdateSplashscreenHandler(ByVal Text As String) Handles Globals.UpdateSplashScreen 

    StatusWindowText.Text = Text 

End Sub 

儘管事實WPF畫面「凍結」,直到「globalclass InitializeProgram」方法完成(txtStatusWindow.Text不更新,而不使用深奧的「刷新」擴展...),我完全相信我們正在做這個錯誤的方式。

有在那裏關於整合,然後在現有代碼結合對象珍貴的幾個例子。感謝您檢查我們的小窘境。

+0

你是說沒有涉及到XAML,你直接從VB創建所有的UI? – MojoFilter 2010-10-08 13:09:52

回答

0

如果這個狀態窗口是在XAML和狀態窗口是一個用戶控件,然後一個狀態文本依賴屬性添加到狀態窗口。然後,在XAML可以綁定到該財產的價值的東西,如:

<UserControl x:Name="MyStatusWindow" ...> 
    <TextBlock Text="{Binding Path=StatusText, ElementName=MyStatusWindow}" /> 
</UserControl> 

然後,從您的活動,只需更新狀態文本屬性的值。

(是,即使靠近你問的是什麼?)

此外,有關凍結:與其這樣做,更新在類的構造函數,你可能想從裝入的事件做控制。儘管如此,它仍然會凍結,除非你將它移動到一個單獨的線程。現在,這發生在UI消息泵運行的同一線程上。這是該UI的Dispatcher

+0

「StatusWindowText」對象只是一個常見的文本框,因此它具有依賴項屬性。例程失敗的原因結果是我們調用類「全局類」中的子類。該子程序不會更新調用窗體「SplashScreen」,因爲我們正在觸發一個子程序中的所有事件。當我們將事件分解成一個Select Case語句,並且使用dispatchertimer驅動它時,文本框會很好地更新。所以,事實證明,MojoFilter是正確的!謝謝! – MBunds 2010-10-11 23:11:27