我正在构建一个需要用户输入数字的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;
}
两个问题:
MyNumpad.xaml
内已有“确定”按钮。是否可以访问mainDisplay
和popupDialog
点按Ok_Inside_Numpad
按钮?我怎样才能将变量传递给
MyNumpad
构造函数?
如何在MyNumpad
退出时获取用户数字输入?
谢谢!请注意,我是WPF的新手,不确定我的方法是否有用。欢迎任何想法!
答案 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);
}