【问题标题】:WPF how to access MainPage elements from Popup PageWPF如何从弹出页面访问MainPage元素
【发布时间】:2014-10-11 00:12:16
【问题描述】:

我正在构建一个需要用户输入数字的 WPF 应用程序。我正在使用 NavigationWindow 并构建了一个包含数字键盘的 Page。该应用程序需要多次输入数字。受this 的启发,我想将数字Page 放入FramePopup,如下所示:

<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已经有一个“确定”按钮。是否可以通过单击Ok_Inside_Numpad 按钮访问mainDisplaypopupDialog?如何将变量传递给 MyNumpad构造函数?

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

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

【问题讨论】:

  • 理想情况下,您应该使用绑定来执行此操作,但如果您想在代码隐藏中执行此操作,让您的mainDisplay 根据弹出窗口的@987654336 切换自己的状态会更容易@ 和 Closed 事件,而不是让弹出窗口中托管的内容负责它应该一无所知的 UI 元素。

标签: c# wpf


【解决方案1】:

正确的方法是bindingViews(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);
} 

【讨论】:

  • 谢谢,正是我需要的!我选择将 Click 事件处理程序添加到 Popup 的 ConfirmButton,因为它在多个位置使用并且每个位置都需要不同的确认行为。顺便说一句,在什么样的项目中值得使用 MVVM?换句话说,如果可能的话,什么时候可以体面地没有它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多