【问题标题】:Send data from a UserControl in a Popup to the parent Page将数据从弹出窗口中的用户控件发送到父页面
【发布时间】:2014-01-22 13:44:30
【问题描述】:

我有一个弹出窗口,它只是一个用户控件,基本上只是一个表单,上面有一个“完成”按钮。我找不到将数据从表单发送到页面的方法,以便我可以解析和使用数据来创建特定元素。基本上,当单击“完成”按钮时,我找不到发送甚至访问页面以存储数据的方法。

绑定似乎也不是要走的路,因为当单击“完成”按钮时,页面会创建另一个用户控件,其中填充了从弹出窗口中的表单接收到的数据。由于绑定似乎不适合我的问题,接下来是传递数据,但由于我找不到引用页面的方法,我也无法使用此解决方案。

页面就是这样的:

<Button HorizontalAlignment="Left" Margin="227,115,0,0" VerticalAlignment="Top">
    <Popup IsLightDismissEnabled="True">
        <local:PopupMenu/>
    </Popup>
</Button>
<TextBox HorizontalAlignment="Left" Margin="230,340,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Height="55" Width="455"/>

UserControl 基本上是:

<UserControl
x:Class="SimpleShop.PopupMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SimpleShop"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Height="800" Width="1295">
<TextBlock text="Enter A Number" Fontsize="24" TextWrapping="Wrap" Height="40" Width="200"  />
<TextBox x:Name="Number1" Text="0" TextWrapping="Wrap" Height="40" Width="200"  />
<TextBlock text="Enter A Number" Fontsize="24" TextWrapping="Wrap" Height="40" Width="200"  />
<TextBox x:Name="Number2" Text="0" TextWrapping="Wrap" Height="40" Width="200" />
<Button x:Name="AddItemButton" Content="Button" FontSize="24"  Height="40" Width="110" Click="AddItemButton_Click" />
</UserControl>

所以当按下页面上的按钮时会出现弹出窗口,在输入 2 个数字并按下弹出窗口上的按钮后,页面上的文本框会更新为 2 个输入数字相乘的结果,并且弹出窗口关闭。我遇到的问题是按下弹出窗口上的按钮后更新页面上的文本框。我找不到指向或引用文本框的方法。

【问题讨论】:

  • 这个问题太抽象了,无法回答。请发布您的代码的相关部分。
  • 抱歉,我添加了一个示例代码并总结了正在发生的事情以及我正在尝试完成的事情。我会添加实际代码,但我被告知我不允许这样做,所以这是我能逃脱的最好的。
  • 没有问题,感谢您的更新。不过,还有一个问题——您实际上是如何显示弹出窗口的?大概在代码隐藏的某个地方?
  • 是的,即使是页面上的按钮,它也只是在点击中,它就在打开 标记的正上方...我应该命名按钮和弹出窗口,但代码是这:如果(!MyPopUp->IsOpen){ MyPopUp->IsOpen = true; }

标签: wpf xaml visual-c++ user-controls


【解决方案1】:

所以你需要两个部分:

  1. 弹出窗口关闭时的通知
  2. 访问弹出表单的结果。

首先,考虑使用Closed事件,即:

<Popup IsLightDismissEnabled="True" Closed="Popup_Closed">
    <local:PopupMenu x:Name="popupUserControl"/>
</Popup>

第二个,我只是在PopupMenu 上公开一个属性,它会给你结果。像这样的:

public partial class PopupMenu : UserControl
{
    public double Result { get; private set; }

    public AddItemButton_Click(object sender, EventArgs e)
    {
        Result = double.Parse(Number1.Value) + double.Parse(Number2.Value);
    }
}

然后可以根据需要设置文本,在Closed事件处理函数中:

private void Popup_Closed(object sender, EventArgs e)
{
    txtResult.Text = popupUserControl.Result.ToString();
}

【讨论】:

  • 我有点困惑,抱歉我对 C# 不是很熟悉...我可以阅读并知道它的作用,但我并不总是了解它是如何工作的。在这种情况下,get 和 set 用于名为 Result 的双变量,对吗?另外,在 C++ 中,我只需在类中创建一个 double 类型的本地 var,然后创建 2 个函数名称 getResult 和 setResult 来模拟这个过程?提前感谢您的帮助。
  • @user3164339 是的,完全正确。 { get; set; } 是 C# 的简写,称为自动实现的属性:msdn.microsoft.com/en-us/library/bb384054.aspx
  • 我想我还有一个问题,您发布的 PopupClosing 函数是您在 Popup 声明中使用的 Closed="Popup_Closed" 吗?另外,我明白了为什么这有效,而不是将 txtResult.Text 绑定到 UserControl 上的某些东西:之所以有效,是因为弹出窗口与 txtResult 在同一范围内声明?我认为更好的表达方式是,我在将 txtResult.Text 绑定到 popupUserControl 时遇到问题,因为每次我尝试在 popupUserControl 中设置绑定的源和路径时,txtResult 都没有显示为可访问的。
  • 是的,这是一个错字——应该是Popup_Closed。对于第二个问题:绑定与使用代码隐藏有点不同。当代码隐藏不起作用时,我不知道。但我知道,为了绑定工作,目标(ElementName)必须在同一个名称范围内:msdn.microsoft.com/en-us/library/ms746659(v=vs.110).aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多