访问用户Control中的主页面UI

时间:2014-01-07 05:17:20

标签: c# xaml windows-phone-8

我有mainPage.xaml和userControl.xaml.I在mainPage中调用了userControl。 mainPage有一个名为“grd”的网格,userControl有一个名为“btn”的按钮。现在当我点击按钮然后点击userControl的事件将被引发。在这种情况下,我想隐藏Grid(在mainPage.xaml中)。如何在userControls中访问mainPage控件?

5 个答案:

答案 0 :(得分:2)

对于Windows Phone 8,试试这个:

(((Application.Current as App).RootVisual as PhoneApplicationFrame).Content as Page)

答案 1 :(得分:1)

您可以使用以下代码访问当前显示的页面:

var mainPage = (PhoneApplicationPage)((App)Application.Current).RootFrame.Content;

答案 2 :(得分:0)

查看我的答案,因为OP想要设置appbar的可见性,我的答案也适用于Grid

how to programatically open and close bottomappbar using a eventhandler that exist in a usercontrol back code?

答案 3 :(得分:0)

如果您正在使用MVVM(正如您在@ har07的回答中所述),则不应使用用户控制页面中的事件处理程序隐藏主页面中的网格。相反,您应该将命令绑定到控制页面中的按钮。此命令应更改主页面的视图模型,此更改应通过该视图模型通知主页面。

在下一个示例中,我使用MVVM Light,但其他MVVM库可能几乎一样。

将属性添加到主页的视图模型中:

public class MainViewModel : BaseViewModel
{
  …your code here
  private bool _isValid;
  public bool IsValid
  {
    get
    {
      return _isValid;
    }
    set
    {
      _isValid = value;
      RaisePropertyChange("IsValid");
    }
  }
}

在主页面中将Visibility绑定到IsValid

<Grid Visibility="{Binding IsValid, Converter={StaticResource converter}}">
  …content here
</Grid>

现在,如果IsValid为真,则网格可见。

将命令添加到用户控件的视图模型中:

public class UserControlViewModel : BaseViewModel
{
  …your code here
  public RelayCommand InvalidateGridCommand { get; private set; }
  public UserControlViewModel()
  {
    InvalidateGridCommand = new RelayCommand( () => InvalidateGrid() );
  }

  private void InvalidateGrid()
  {
    var mainvm = SimpleIoc.Default.GetInstance(MainViewModel);
    mainvm.IsValid = false;
  }
}

在用户控制页面中,将Button绑定到Command

<Button Command="{Binding InvalidateGridCommand}">
  Invalidate
</Button>

现在,点击该按钮会将IsValid上的MainViewModel设置为false,从而隐藏Grid

答案 4 :(得分:0)

我来这里寻找这个问题的答案,经过一些尝试,我可以使用以下方式访问Windows Phone 8.1应用程序的主页面:

var mainPage = (MainPage)(Window.Current.Content as Frame).Content.

要访问MainPage中声明的控件,您还需要为其提供x:Name并将x:FieldModifier更改为"Internal""Public"