Перейдите к другому wpf, не открывая новые окна

Я новичок в WPF, я не могу найти способ открыть новое окно WPF в том же основном приложении WPF, что и метод Frame, вот код: -

<Window x:Class="WPF_FINAL.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_FINAL"
        mc:Ignorable="d"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        TextElement.Foreground="{DynamicResource MaterialDesignBody}"
        TextElement.FontWeight="Regular"
        TextElement.FontSize="13"
        TextOptions.TextFormattingMode="Ideal"
        TextOptions.TextRenderingMode="Auto"
        Background="{DynamicResource MaterialDesignPaper}"
        Height="768"
        Width="1366"
        WindowState="Maximized"
        Title="MainWindow">

    <Grid Background="#dff9fb"
          Margin="33,10,-33,-10">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20" />
            <ColumnDefinition Width="13.5" />
            <ColumnDefinition Width="152" />
            <ColumnDefinition Width="auto"
                              MinWidth="335.5" />
            <ColumnDefinition />
            <ColumnDefinition Width="20" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="20" />
        </Grid.RowDefinitions>
        <Frame Margin="0,0,0.5,10"
               Grid.ColumnSpan="5"
               x:Name="main"
               Grid.RowSpan="6">

        </Frame>
    </Grid>
</Window>

cs-код

            main.Content = new Window1();

но когда я запускаю, это дает мне исключение перерыва, я пробовал также службу навигации, но обнаружил, что она связана только со страницами. Любое предложение, как это сделать? благодарю вас


person Ahmed    schedule 02.04.2020    source источник
comment
Нет, так нельзя, Ахмед! Вы должны использовать UserControl или Pages для этой цели   -  person Rao Hammas    schedule 02.04.2020
comment
Посмотрите на этот урок: wpf-tutorial.com/ usercontrols-and-customcontrols/   -  person Rao Hammas    schedule 02.04.2020
comment
и этот stackoverflow.com/questions/29952693/   -  person Rao Hammas    schedule 02.04.2020
comment
UserControl точно так же, как window без рамки (по умолчанию), все в порядке, и вы можете создать экземпляр и использовать его так же, как окно. Но в отличие от Window вы можете встроить userControl внутрь Window. Надеюсь, поможет :)   -  person Rao Hammas    schedule 02.04.2020
comment
Также есть элемент управления Popup, который создает краткосрочное диалоговое окно, полностью основанное на пользовательском интерфейсе. docs.microsoft.com/en-us/dotnet/ фреймворк/wpf/controls/   -  person Phoenix Stoneham    schedule 02.04.2020


Ответы (1)


Frame может содержать любой контент, даже HTML.
Page предоставляет только специальные помощники, такие как NavigationService, чтобы сделать навигацию между страницами более удобной.

Window не может быть дочерним элементом другого элемента, например. ребенок Frame. Это должен быть корневой элемент. При присвоении Window Frame.Content Frame становится родителем Window, что является недопустимым.

Простым решением было бы преобразовать класс Window1 в класс UserControl:

<UserControl x:Class="MyUserControl">
  <TextBlock Text="TEST CONTROL" FontSize="25"/>
</UserControl>

Теперь ваше задание будет работать:

main.Content = new MyUserControl();

or

main.Navigate(new MyUserControl());

or

main.Navigate("file path to/MyUserControl.xaml");
person BionicCode    schedule 02.04.2020