Как закрыть текущий пользовательский элемент управления и открыть новый пользовательский элемент управления в WPF внутри пользовательского элемента управления - PullRequest
0 голосов
/ 08 февраля 2020

Я новичок в приложении WPF, мне нужно разработать приложение с пользовательским контролем, пользовательский контроль будет работать как страницы, у меня есть открытый пользовательский элемент управления в MainWindow, который будет выбирать язык по щелчку, а затем закрывать (текущий) элемент управления выбором языка и открывать другой

Код MainWindow

<Window x:Class="WorkForceVisitor.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:WorkForceVisitor"
        mc:Ignorable="d"
        Title="Work Force Pro Visitor" Icon="Images/favicon.ico" Height="800" Width="1200">
    <Window.Background>
        <ImageBrush ImageSource="Images/bg.png"/>
    </Window.Background>
    <Grid Margin="10,0,1,5" RenderTransformOrigin="0.556,0.496" Height="754" VerticalAlignment="Bottom">
        <StackPanel Name="myStack"  Grid.Row="1" >
        </StackPanel>
    </Grid>
</Window>

MainWindow.cs

        private Header _Header;
        private Visitor _Visitor;
        private Control _currentUser;

        public MainWindow()
        {
            InitializeComponent();
            _Header = new Header();
            _LanguageSelection = new LanguageSelection();
            _Visitor = new Visitor();
            _currentUser = _LanguageSelection;
            myStack.Children.Add(_currentUser);
        }

пользователь нажмет либо arabi c, либо engli sh при нажатии кнопки мы закроем LanguageSelection элемент управления и откроем элемент управления Visitor в StackPanel Name = "myStack", который находится внутри главного окна

LanguageSelection

<UserControl x:Class="WorkForceVisitor.LanguageSelection"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WorkForceVisitor"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Margin="10,0,1,5" RenderTransformOrigin="0.556,0.496" Height="754" VerticalAlignment="Bottom">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Image  MouseDown="EnglishPress" Grid.Column="1" HorizontalAlignment="Right" Height="200" Margin="0,0,38,272" VerticalAlignment="Bottom" Width="290" Source="Images/english.PNG">
            <Image.OpacityMask>
                <ImageBrush ImageSource="Images/arabic.PNG"/>
            </Image.OpacityMask>
        </Image>
        <Image MouseDown="AranbicPress" Grid.Column="2" Height="200" Margin="50,0,0,272" VerticalAlignment="Bottom" Source="Images/arabic.PNG" RenderTransformOrigin="0.511,0.527" HorizontalAlignment="Left" Width="285">
            <Image.OpacityMask>
                <ImageBrush ImageSource="Images/english.PNG"/>
            </Image.OpacityMask>
        </Image>
        <Image Grid.Column="1" HorizontalAlignment="Right" Height="100" Margin="0,0,440,517" VerticalAlignment="Bottom" Width="294" Grid.ColumnSpan="2" Source="Images/Logo.png"/>
    </Grid>
</UserControl>

languageselection.cs

static bool isEnglish = false;
        private void AranbicPress(object sender, MouseButtonEventArgs e)
        {
            // need to close current control and show visitor control in mainWindow 
        }

        private void EnglishPress(object sender, MouseButtonEventArgs e)
        {
            // need to close current control and show visitor control in mainWindow
            isEnglish = true;
        }

1 Ответ

0 голосов
/ 09 февраля 2020

Я не профессионал, но это должно работать:

MainWindow.cs

    public static Window Current;
    private Header _Header;
    private Visitor _Visitor;
    private Control _currentUser;


    public MainWindow()
    {
        Current = this;
        InitializeComponent();
        _Header = new Header();
        _LanguageSelection = new LanguageSelection();
        _Visitor = new Visitor();
        _currentUser = _LanguageSelection;
        myStack.Children.Add(_currentUser);
    }

languageselection.cs

static bool isEnglish = false;
        private void AranbicPress(object sender, MouseButtonEventArgs e)
        {
            MainWindow.Current.myStack.Children.Clear();               
            MainWindow.Current.myStack.Children.Add(MainWindow.Current._Visitor);

        }

        private void EnglishPress(object sender, MouseButtonEventArgs e)
        {
            MainWindow.Current.myStack.Children.Clear();               
            MainWindow.Current.myStack.Children.Add(MainWindow.Current._Visitor);
            isEnglish = true;
        }

Однако:

1) Я не думаю, что вам нужна панель стека внутри сетки только для одного ребенка;

2) Я не думаю, что вам нужно инициализировать ваши usercontrols, прежде чем пользователь нуждается в них;

3) Я бы, вероятно, лучше создать методы в MainWindow, чтобы заменить элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...