2012-02-15 84 views
1

我有一個控件,我把對話框作爲內容。由於這個對話框的重新定義,我必須在每次需要時創建它(Show/Hide不會這樣做)。我希望我的控制能夠記住調用之間的字段內容。雖然我可以應用viewmodel來實現這一點,但我更喜歡將控件作爲一個字段來保存,並將其作爲每次我需要時的對話內容。但我遇到以下錯誤:設置控件爲多個控件的內容

「指定的元素已經是另一個元素的邏輯子元素,請先斷開它。」

我試圖在關閉它之前將對話框窗口的內容賦值爲null,但它不能解決問題。有什麼我可以做的嗎?

回答

1

設置window.Content = null適合我。以下是我使用的代碼:

public partial class MainWindow : Window 
{ 
    TextBlock textBlock = new TextBlock(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     TestWindow testWindow = new TestWindow(); 
     testWindow.Content = textBlock; 
     testWindow.Closing += HandleTestWindowClosing; 
     testWindow.Show(); 
    } 

    void HandleTestWindowClosing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     var testWindow = sender as TestWindow; 
     if(testWindow!=null) 
     { 
      testWindow.Content = null; 
      testWindow.Closing -= HandleTestWindowClosing; 
     } 
    } 
} 
+0

嗯,把內容設置事件哈德勒,而不是我的方法的一切後,工作正常。謝謝! – noaRAVE 2012-02-15 09:32:40

0

看看下面的工作例子。這不完全是你的情況,但非常接近。關鍵是將'Child'屬性設置爲null。它將文本框從頂部邊框移到底部。

<Window x:Class="SO.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> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Button Grid.Row="0" Click="Move_Click">Move</Button> 
     <Border x:Name="topBorder" Grid.Row="1"> 
      <TextBlock x:Name="ctrl">Some Text Block</TextBlock> 
     </Border> 
     <Border x:Name="bottomBorder" Grid.Row="2"/> 
    </Grid> 
</Window> 

和後面的代碼:

using System.Windows; 

namespace SO 
{ 
    public partial class MainWindow :Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Move_Click(object sender, RoutedEventArgs e) 
     { 
      this.topBorder.Child = null; 
      this.bottomBorder.Child = this.ctrl; 
     } 
    } 
} 
相關問題