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