我有一個控件,我把對話框作爲內容。由於這個對話框的重新定義,我必須在每次需要時創建它(Show/Hide不會這樣做)。我希望我的控制能夠記住調用之間的字段內容。雖然我可以應用viewmodel來實現這一點,但我更喜歡將控件作爲一個字段來保存,並將其作爲每次我需要時的對話內容。但我遇到以下錯誤:設置控件爲多個控件的內容
「指定的元素已經是另一個元素的邏輯子元素,請先斷開它。」
我試圖在關閉它之前將對話框窗口的內容賦值爲null,但它不能解決問題。有什麼我可以做的嗎?
我有一個控件,我把對話框作爲內容。由於這個對話框的重新定義,我必須在每次需要時創建它(Show/Hide不會這樣做)。我希望我的控制能夠記住調用之間的字段內容。雖然我可以應用viewmodel來實現這一點,但我更喜歡將控件作爲一個字段來保存,並將其作爲每次我需要時的對話內容。但我遇到以下錯誤:設置控件爲多個控件的內容
「指定的元素已經是另一個元素的邏輯子元素,請先斷開它。」
我試圖在關閉它之前將對話框窗口的內容賦值爲null,但它不能解決問題。有什麼我可以做的嗎?
設置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;
}
}
}
看看下面的工作例子。這不完全是你的情況,但非常接近。關鍵是將'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;
}
}
}
嗯,把內容設置事件哈德勒,而不是我的方法的一切後,工作正常。謝謝! – noaRAVE 2012-02-15 09:32:40