2014-01-07 2 views
0

У меня есть mainPage.xaml и userControl.xaml.I называется userControl в mainPage. mainPage имеет Grid с именем «grd», а userControl имеет кнопку «btn». Теперь, когда я нажму на кнопку, щелкните событие userControl. В этом случае я хочу скрыть Grid (это в mainPage.xaml). Как я могу получить доступ к элементам управления mainPage в userControls?Доступ к основному пользовательскому интерфейсу страницы

ответ

1

Вы можете получать доступ в данный момент отображается страница с помощью этого кода:

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

Событие доступно в userControl; будет ли это работать? –

+0

определенно, уже пробовал это. 'Application.Current..' доступен с любого элемента управления/страницы вашего приложения Windows Phone и возвращает тот же результат. – har07

+0

Я не могу использовать его. Код, который вы написали, предназначен для wp7. В wp8 я не могу найти .RootFrame.Content. Пожалуйста, объясните –

0

Заканчивать мой ответ, что ОП хотел установить видимость AppBar, мой ответ будет работать на Grid также.

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

+0

Не могли бы вы объяснить, как это работает? var isOpen = ((AppBar) ((BlankPage4) ((Grid) this.Parent) .Parent) .BottomAppBar) .IsOpen; –

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.

2

Для Windows Phone 8 попробовать это:

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

Я пришел сюда в поисках ответа на этот вопрос, и после некоторых попыток я мог получить доступ к главной странице моего Windows Phone 8.1 приложение с помощью:

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

Чтобы получить доступ к элементам управления, указанным в MainPage, вам необходимо также указать их x:Name и изменить их x:FieldModifier на "Internal" или "Public".

Смежные вопросы