2010-10-08 67 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