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 中使用绑定,其中两个窗口都指向同一个 ViewModel(具有名为 MySharedContent 的属性)

Content="{Binding Path=MySharedContent}"

但它不起作用。

这可能吗?我在做傻事吗?我在想两个窗口都会有一个指向要渲染的内容的指针……但似乎它们不能共享同一个实例?

编辑:

所以基本答案是 UI 元素(文本框、用户控件等)只能有 1 个父级。因此,我需要有两个单独的 UI 元素共享相同的关联数据。明白了(感谢大家的帮助,为大家投票)

4

3 回答 3

1

我猜控件的父容器会在分配时更新,从而创建该行为(尽管我最初也假设与您相同)。

你想做什么?如果您希望两个窗口同步,您可以传递一个字符串变量;使用此值更新每个备用窗口中的文本框。

于 2012-10-31T21:31:21.953 回答
1

而不是试图在应用程序主中进行处理,您必须在每个表单事件处理程序中进行处理。

文本框示例;在Form1我们有MyTextBoxForm2我们也有我MyTextBox的等价物。在这两种形式中,当文本更改时,我都有一个事件处理程序。如果在Form1I中调用事件处理程序,则Form2.MyTextBox.Text = Form1.MyTextBox.Text;在 Form2 的事件处理程序中执行相反的操作。

在所有事件处理程序中执行此操作,表单将相互镜像。

于 2012-10-31T21:34:30.847 回答
1

控件有一个Parent属性,该属性返回它们被放置的容器。因此,由于每个控件都TextBox需要有自己的一组属性,例如其大小和位置,因此您的方法无法工作。您可以共享两个窗口中"test"显示的值(在您的情况下为字符串),但不能共享它们本身。TextBoxesTextBoxes

创建两个文本框!

于 2012-10-31T21:40:13.690 回答