我试图让两个窗口的内容共享,但它似乎没有像我期望的那样工作。
以下是一个显示此内容的简单示例:
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中使用绑定,其中两个窗口都指向同一个ViewModel(具有名为MySharedContent的属性)
Content="{Binding Path=MySharedContent}"
但它不起作用。
这可能吗?我做了些蠢事吗?我以为这两个窗口都会有一个指向渲染内容的指针......但是它们似乎无法共享同一个实例?
编辑:
所以基本的答案是UI元素(文本框,用户控件等)只能有1个父元素。因此,我需要有两个独立的UI元素共享相同的关联数据。得到它(感谢所有人的帮助,为所有人提高选票)
答案 0 :(得分:1)
我猜测控件的父容器在赋值时得到更新,创建了这种行为(尽管我最初假设也是如此)。
你想做什么?如果你想让两个窗口同步,你可以传递一个字符串变量;使用此值更新每个备用窗口中的文本框。
答案 1 :(得分:1)
而不是尝试在应用程序main中进行处理,而是必须在每个表单事件处理程序中执行此操作。
文本框示例;在Form1
MyTextBox
我们Form2
MyTextBox
我们的Form1
也相同。在这两种形式中,我都有一个事件处理程序,用于文本更改时。如果在Form2.MyTextBox.Text = Form1.MyTextBox.Text;
中调用事件处理程序,我设置{{1}}并在Form2的事件处理程序中执行反向操作。
在所有事件处理程序中执行此操作,表单将相互镜像。
答案 2 :(得分:1)
控件有一个Parent
属性,用于返回放置它们的容器。因此,每个TextBox
都需要拥有自己的一组属性,例如它的大小和位置,因此您的方法无法正常工作。您可以在两个窗口中共享"test"
显示的值(在您的案例中为字符串TextBoxes
,但不能共享TextBoxes
。
创建两个文本框!