2016-01-29 32 views
0

我的解決方案包含一個名爲Manager(帶有一個名爲ProductionManager的類)的庫以及一個WPF項目。 我希望ProductionManager類的一種方法可以訪問WPF的UIcontrol,我該怎麼做?從單獨的類庫訪問UI控件

更具體地說,我的UI有一個按鈕和一個TextBox。按下按鈕,我從我的庫中調用一個方法,從中我想更新UI窗口中的TextBox

我知道我應該使用Dispatcher這樣做,但我不知道如何正確設置它。任何人都可以幫忙嗎?

這裏MainWindow.xaml:

<Window x:Class="WPFMainPanel.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Name="btnRun" Content="Run" HorizontalAlignment="Left" Margin="157,10,0,0" VerticalAlignment="Top" Width="75" Click="btnRun_Click"/> 
     <TextBox Name="tbox_Data" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/> 
    </Grid> 
</Window> 

這裏MainWindow.xaml.cs

namespace WPFMainPanel 
{ 
    public partial class MainWindow : Window 
    { 
     private ProductionManager myManager = ProductionManager.Instance; 

     private void btnRun_Click(object sender, RoutedEventArgs e) 
     { 
      myManager.DoSomethingElse(); 
     } 
    } 
} 

,在這裏我ProductionManager類我Manager庫

namespace Manager 
{ 
    public class ProductionManager 
    { 
     private static ProductionManager instance; 

     private ProductionManager() { } 

     public static ProductionManager Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new ProductionManager(); 
       } 
       return instance; 
      } 
     } 

     public void DoSomethingElse() 
     { 
      // Change the Text Box Named tbox_Data from here 
     } 
    } 
} 

任何人都可以幫助我嗎?

+0

你喜歡什麼邏輯,以'Dosomethingelse'方法上工作,這是不好的做法,將在其他圖書館相關UI控件的邏輯。 –

+0

嗨Hari在Dosomethingelse我勉強想要將textbox.Text屬性更改爲「Hello World」。底線我試圖通過這個簡單的應用程序來了解有關調度員的更多信息。坦克 – Luke

+0

你可以這樣做,'公共無效Dosomethingelse(Button dobject){Dispatcher.Invoke((Action)(()=> dobject.Content =「Hello World」));}' –

回答

0

你可以嘗試這樣的事情。

在您的Dosomethingelse()方法中獲取對您的文本框的引用。

public void Dosomethingelse(TextBox textBox,string yourText) 
    { 
     var myTextbox = textbox; 
     mytextbox.text = yourText; 
    } 

現在,當你從MainWindows.xaml.cs呼叫這樣,,

myManager.Dosomethingelse(tbox_data,stringYouWantToAdd); 
+0

我認爲這樣做,但如果我這樣做,我將不得不將我的圖書館與WPF應用程序緊密耦合。如果我可以從庫中調用UI的Dispatcher,那麼我可以訪問任何UI控件,而不必提供任何單個方法的參考。我甚至想過要在ProductionManager.cs中添加一個公共的Window myWin。我可以在initialialize()後立即在MainWindow.xaml.cs中初始化myWin;呼叫。你怎麼看? – Luke

+0

我認爲你應該更多地瞭解調度員。我們使用調度員來優先處理我們的任務。本文將對您有所幫助http://weblogs.asp.net/pawanmishra/understanding-dispatcher-in-wpf –

0

好的解決調用方法!我發現從iJay的一個S'回答了這個方法。

首先你必須爲你的MainWindow創建一個靜態變量。所以你的圖書館可以訪問它。你必須創建一個字符串屬性設置你textbox.Then的文本在屬性,你可以使用調度程序來改變文本

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public ProductionManager myManager; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     myManager = new ProductionManager(); 
     window = this; 
    } 

    internal static MainWindow window; 

    public string myString 
    { 
     get { return myTextBox.Text; } 
      //this is where you change the text of your text box 
     set { Dispatcher.Invoke(new Action(() => { myTextBox.Text = value; })); } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     myManager.DoSomething("Hello world"); 
    } 
} 

的set訪問現在編輯「DoSomething的()」方法,下面,

public void Dosomethingelse(string text) 
{ 
    MainWindows.window.myString = text; 
} 
+0

謝謝,但WPF項目在解決方案中引用該庫時,我的庫沒有引用WPF避免循環引用。這意味着MainWindows類不被庫識別。你能解決這個問題嗎? – Luke

+0

您可以通過使用動作來解決這個問題,但我不知道使用調度程序執行此操作的方法。因爲你只是不能通過UI的調度程序從你的庫類訪問UI線程。因爲該調度程序由UI線程擁有。 –