WPF如何从弹出页面访问MainPage元素

时间:2014-10-10 10:33:36

标签: c# wpf

我正在构建一个需要用户输入数字的WPF应用程序。我正在使用NavigationWindow并构建了一个包含数字小键盘的Page。该应用程序需要多次输入数字。灵感来自this,我想将Page内的数字Frame放在Popup内,如下所示:

<Grid Name="mainDisplay">
    <Popup Name="popupDialog" PlacementTarget="{Binding ElementName=aInputBox Placement="Center">
        <StackPanel>
            <Frame Source="MyNumpad.xaml"/>
            <Button Click="OK_Outside_Click">Ok_Outside_Numpad</Button>
        </StackPanel>
    </Popup>
// invalid comment and other stuff in grid....
</Grid>

单击“Ok_Outside_Numpad”Button时,小键盘将消失,主页面将重新启用。代码如下:

private void OK_Outside_Click(object sender, RoutedEventArgs e)
{
    popupDialog.IsOpen = false;
    mainDisplay.IsEnabled = true;
}

两个问题:

  1. MyNumpad.xaml内已有“确定”按钮。是否可以访问mainDisplaypopupDialog点按Ok_Inside_Numpad按钮?我怎样才能将变量传递给 MyNumpad构造函数?

  2. 如何在MyNumpad退出时获取用户数字输入?

  3. 谢谢!请注意,我是WPF的新手,不确定我的方法是否有用。欢迎任何想法!

1 个答案:

答案 0 :(得分:2)

正确的方法是binding View s(NavigationWindow和MyNumpad.xaml)到ViewModel(或几个ViewModel)。使用数据绑定,您只需将值设置为false即可关闭Popup(因为Popup的IsOpen属性绑定到该值)。控件所在的位置并不重要,因为您不需要操作代码中的控件。

但在阅读这篇长篇文章并开始学习MVVM之前,您可以对代码进行一些修改以使其正常工作。

您无法从托管页面访问MainPage元素,因为托管页面没有对MainPage的引用。正如您所想,您可以将MainPage传递给MyNumpad的构造函数(在代码中执行,并记住修改MyNumpad的构造函数)。

public MainWindow()
{
    InitializeComponent();
    MyNumpad numpad = new MyNumpad(this);
    frame1.Navigate(numpad);
} 

然后,您可以从弹出页面访问MainPage元素。

但是更容易向Popup按钮添加Click事件处理程序,因为事件处理程序在MainWindow中定义,它可以访问MainWindow中的所有控件。 (请记住删除MyNumpad中定义的事件处理程序。)

string strNumber;
public MainWindow()
{
    InitializeComponent();
    MyNumpad numpad = new MyNumpad();
    numpad.button1.AddHandler(Button.ClickEvent, new RoutedEventHandler(
        (s, e) => 
        {
            //suppose there is a TextBox in the page to accept user input
            strNumber = numpad.InputTextBox.Text; 
            popupDialog.IsOpen = false;
            mainDisplay.IsEnabled = true; 
        }), false);
    frame1.Navigate(numpad);
}