#c# #wpf #xaml
#c# #wpf #xaml
Вопрос:
У меня есть мое главное окно с рамкой внутри сетки.
Я хочу загрузить страницу 1 внутри фрейма. Теперь у меня есть кнопка на этой Странице1. Эта кнопка должна закрыть страницу 1 и загрузить страницу 2 во фрейме. На второй странице также есть кнопка. С помощью кнопки на странице 2 я хочу загрузить страницу 1. И так далее. Если бы я разместил две кнопки в главном окне, я мог бы загрузить обе страницы, но мне нужны кнопки отдельно на каждой странице.
namespace PageTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
FrameContent.Content = new Page1();
}
}
}
namespace PageTest
{
public partial class Page1 : Page
{
public Page1()
{
InitializeComponent();
}
private void BtnLoadPage2_Click(object sender, RoutedEventArgs e)
{
}
}
}
namespace PageTest
{
public partial class Page2 : Page
{
public Page2()
{
InitializeComponent();
}
private void BtnLoadPage1_Click(object sender, RoutedEventArgs e)
{
}
}
}
Комментарии:
1. Добро пожаловать в StackOverflow! Вы пытались сделать свое главное окно статичным? Или сделать как a
public static MainWindow mw = this;
? Благодаря этому вы можете получить доступ к фрейму отовсюду
Ответ №1:
Вы могли бы использовать тот факт, что нажатие кнопки является маршрутизируемым событием, чтобы обработать его в родительском фрейме.
<Frame Name="ParentFrame"
Button.Click="ParentFrame_Click"
>
</Frame>
Код
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ParentFrame.Navigate(new Page1());
}
private void ParentFrame_Click(object sender, RoutedEventArgs e)
{
Button btn = e.OriginalSource as Button;
if(btn == null || btn.Tag == null)
{
return;
}
Page page = (Page)Activator.CreateInstance((Type)btn.Tag);
ParentFrame.Navigate(page);
}
}
Кнопка на странице 1:
<Button Width="100" Height="30"
Content="Go Page 2"
Tag="{x:Type local:Page2}"
/>
Страница 2:
<Button Width="100" Height="30"
Content="Go Page 1"
Tag="{x:Type local:Page1}"
/>
Однако. Это было бы сочтено неподходящим для коммерческого приложения во всех командах, в которых я работал. Гораздо более привычно использовать MVVM и viewmodel для первой навигации с usercontrols, представленными contentcontrols.
Ответ №2:
Вы можете поместить код для обмена страницами в MainWindow.cs, тогда вам нужно будет определить события на обеих страницах, например; PageSwapRequested . Вы будете регистрироваться на это событие каждый раз, когда создается страница, и при нажатии кнопки это вызовет событие.
Что-то вроде этого,
namespace PageTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var page1 = new Page1();
page1.PageSwapRequested = Page1_PageSwapRequested;
FrameContent.Content = page1;
}
private void Page1_PageSwapRequested(object sender, EventArgs e)
{
//TODO: swap pages and don't forget to remove Page1_PageSwapRequested event handler.
//page1.PageSwapRequested -= Page1_PageSwapRequested;
}
}
}
namespace PageTest
{
public partial class Page1 : Page
{
public event EventHandler PageSwapRequested;
private void OnPageSwapRequested()
{
this.PageSwapRequested?.Invoke(this, EventArgs.Empty);
}
public Page1()
{
InitializeComponent();
}
private void BtnLoadPage2_Click(object sender, RoutedEventArgs e)
{
OnPageSwapRequested();
}
}
}
namespace PageTest
{
public partial class Page2 : Page
{
public event EventHandler PageSwapRequested;
private void OnPageSwapRequested()
{
this.PageSwapRequested?.Invoke(this, EventArgs.Empty);
}
public Page2()
{
InitializeComponent();
}
private void BtnLoadPage1_Click(object sender, RoutedEventArgs e)
{
this.OnPageSwapRequested();
}
}
}
Комментарии:
1. Спасибо вам за все ваши ответы. Это было очень полезно. Все методы отлично работают, но этот был лучшим для моего проекта. Извините за мой плохой английский и привет из Германии.