2012-10-31 60 views
1

我試圖讓兩個窗口的內容被共享,但它似乎沒有像我期望的那樣工作。同時在兩個窗口之間共享內容

下面是一個簡單的例子示出了這樣的:

class TestClass 
{ 
    [STAThread] 
    public static void Main(string[] args) 
    { 
     Application app = new Application(); 

     TextBox t = new TextBox(); 
     t.Text = "test"; 

     Window w1 = new Window(); 
     w1.Content = t; 
     w1.Show(); 

     Window w2 = new Window(); 
     w2.Content = t; 
     w2.Show(); 


     app.Run(); 
    } 
} 

如果我通過在調試模式下程序步驟,我可以看到w1具有文本框,但只要該呼叫w2.Content = t;然後w1失去文本框...然後它只出現在w2

我也使用Xmal位,其中兩個窗口都指向同一視圖模型結合(與命名MySharedContent屬性)

Content="{Binding Path=MySharedContent}"

嘗試,但它不工作。

這可能嗎?我在做一些愚蠢的事情嗎?我在想這兩個窗口都會有一個指向渲染內容的指針......但它幾乎看起來像不能共享同一個實例?

編輯:

所以基本的答案是,一個UI元素(文本框,用戶控件等)只能有1個父。因此,我需要有兩個獨立的UI元素共享相同的關聯數據。明白了(謝謝大家的幫助,爲大家提高票數)

+1

UI控件通常只能是一個元素的子元素。 – Tejs

+0

有沒有辦法解決它? 對於上面的例子,我被迫只有兩個單獨的文本框,都綁定到相同的字符串值的文本? – 00jt

+1

這將是適當的反應。控制本身不共享;文本是語義的。 – Tejs

回答

1

控件有一個Parent屬性,它返回它們被放置的容器。因此,因爲每個TextBox都需要像它的大小和位置一樣擁有自己的一組屬性,所以您的方法無法工作。您可以在兩個窗口中共享TextBoxes顯示的值(您的案例中的字符串"test"),但不能自己分配TextBoxes

創建兩個文本框!

+0

啊這是有道理的......只有一個父母是可能的。 – 00jt

1

我猜控制的父容器得到更新的任務,創建該行爲(雖然我會假設你最初也一樣)。

你想做什麼?如果你想讓兩個窗口同步,你可以傳遞一個字符串變量;使用此值更新每個備用窗口中的文本框。

+0

我的實際代碼是非常不同的窗口,它們在每個窗口內都有一個共享的(複雜的)用戶控件...這個用戶控件也可以用不同的用戶控件替換...並且我希望每個窗口都有一個ContextControl誰的數據被綁定到當前的用戶控件類。 我被迫做了2個相同的用戶控件的實例,並綁定每個文本/圖像/等內? – 00jt

+0

我對此並不是100%,但我懷疑沒有辦法在兩個窗口中同時擁有相同的控件實例。另一個解決方法可能是讓控制開關上下文 - 即將控件的引用傳遞給每個窗口,每個窗口將該控件引用保存在一個變量中,然後在獲取焦點時,窗口將控件添加到其控件集合中? – JohnLBevan

1

與其試圖在應用程序主體中執行處理,不如在每個表單事件處理程序中執行處理。

Textbox example;在Form1我們有MyTextBoxForm2我們也有我的MyTextBox這是相當於。在這兩種形式中,我都有一個事件處理程序,用於文本更改時。如果事件處理程序在Form1中被調用,我設置了Form2.MyTextBox.Text = Form1.MyTextBox.Text;,並在Form2的事件處理程序中做相反處理。

在所有事件處理程序中執行此操作,並且這些表單將相互鏡像。

+0

我認爲這裏的區別在於照片不是一個UI元素,就像一個文本框。 – 00jt

+0

不,這不是事實。我會用一個例子來更新。 – evanmcdonnal

+0

正確,但您只是更改文本框內的文本,而不是UI元素(文本框)本身的副本。 – 00jt

相關問題