Невозможно обновить текстовое поле из другого фрейма, как я могу это исправить? - PullRequest
1 голос
/ 15 мая 2019

Я создаю небольшую цифровую клавиатуру, как на наших смартфонах, когда я нажимаю клавишу, цифра должна быть записана в TextBox. Вот где у меня проблема, я не могу обновить мой TextBox, когда я нажимаю кнопку.

Мое окно разделено на два кадра одинаковой ширины, клавиатура находится в левом кадре, а текстовое поле - в правом.

Я вызываю метод на моей странице Clavier.xaml.cs:

CallSection EtablissementAppel = new CallSection();

private void UpdateTextBox(string _UpdatePrefix, string _UpdateNumeroDestinataire)
{
    EtablissementAppel.UpdateEtablissementAppel(_UpdatePrefix, _UpdateNumeroDestinataire);
}

Метод в файле CallSection.xaml.cs:

public void UpdateEtablissementAppel(string p, string n)
{
     string Numero = p + n;
     EtablissementAppel.Text = Numero;
}

Код CallSection.xaml:

<TextBox x:Name="EtablissementAppel" Margin="5,5,5,5" PlaceholderText="ETABLISSEMENT D'APPEL" VerticalAlignment="Center" Grid.Column="0" Grid.ColumnSpan="2" Height="37"/>

И все же TextBox не хочет обновляться. Зная, что я могу изменить его текст в любом месте файла CallSection.xaml.cs, но не в этом методе.

РЕДАКТИРОВАТЬ:

Чтобы дать более подробную информацию относительно первых комментариев.

Метод в CallSection.xaml.cs с Debug.WriteLine ():

public void UpdateEtablissementAppel(string p, string n)
{
    string Numero = p + n;
    Debug.WriteLine(Numero);
    EtablissementAppel.Text = Numero;
}

Здесь я вижу в отладчике все мои набранные номера. Но текстовое поле не обновляется.

Вывод отладчика:

12255
122552
1225525
12255255
122552555

CallSection.xaml:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PhonieMartha"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Custom="using:Microsoft.UI.Xaml.Controls"
    x:Class="PhonieMartha.CallSection"
    mc:Ignorable="d" Loaded="Page_Loaded" 
    >

    <Page.Resources>
        <SolidColorBrush x:Key="GraySelected" Color="#FFA3A3A3"/>
        <SolidColorBrush x:Key="GrayUnselected" Color="#33000000"/>
    </Page.Resources>

    <Page.Background>
        <ThemeResource ResourceKey="ApplicationPageBackgroundThemeBrush"/>
    </Page.Background>

    <Grid x:Name="GrillePrincipale">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <TextBox x:Name="EtablissementAppel" Margin="5,5,5,5" PlaceholderText="ETABLISSEMENT D'APPEL" VerticalAlignment="Center" Grid.Column="0" Grid.ColumnSpan="2" Height="37"/>
        <Rectangle x:Name="Call1" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="1" Grid.Column="0" Tapped="Call1_Tapped"/>
        <Rectangle x:Name="Call2" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="1" Grid.Column="1" Tapped="Call2_Tapped"/>
        <Rectangle x:Name="Call3" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="2" Grid.Column="0" Tapped="Call3_Tapped"/>
        <Rectangle x:Name="Call4" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="2" Grid.Column="1" Tapped="Call4_Tapped"/>
        <Rectangle x:Name="Call5" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="3" Grid.Column="0" Tapped="Call5_Tapped"/>
        <Rectangle x:Name="Call6" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="3" Grid.Column="1" Tapped="Call6_Tapped"/>
        <Rectangle x:Name="Call7" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="4" Grid.Column="0" Tapped="Call7_Tapped"/>
        <Rectangle x:Name="Call8" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Fill="#33000000" FocusVisualPrimaryBrush="#FFE03535" Grid.Row="4" Grid.Column="1" Tapped="Call8_Tapped"/>
        <TextBox x:Name="RenvoiAppel" Margin="5,5,5,5" PlaceholderText="RENVOI D'APPEL" VerticalAlignment="Stretch" Grid.Column="0" Grid.ColumnSpan="2" Height="37" Grid.Row="5" InputScope="Number"/>

        <TextBox x:Name="MessageRecu" Margin="5,5,5,5" Text="" VerticalAlignment="Stretch" Grid.Column="2" Grid.Row="4" Grid.ColumnSpan="2"/>
        <ToggleSwitch x:Name="ToggleSwitchRenvoiAppel" Margin="5,5,5,5" OnContent="On" OffContent="Off" Grid.Column="2" Grid.Row="5" HorizontalAlignment="Center" Toggled="ToggleSwitchRenvoiAppel_Toggled"/>
        <TextBlock Grid.Column="3" Margin="5,5,5,5" Grid.Row="5" Text="PhonieMartha                                   Rev1.0" TextWrapping="Wrap" VerticalAlignment="Stretch" TextAlignment="Center" FontSize="12"/>


    </Grid>
</Page>

Вот код XAML главной страницы, который содержит два фрейма:

 <Page
    x:Class="PhonieMartha.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PhonieMartha"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid x:Name="GrilleMainPage">

        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Frame x:Name="CallsSection" Grid.Column="1"/>

        <NavigationView x:Name="NavView" SelectionChanged="NavView_SelectionChanged" IsBackButtonVisible="Collapsed" PaneDisplayMode="Auto" CompactModeThresholdWidth="300" ExpandedModeThresholdWidth="550" Grid.Column="0">

            <NavigationView.MenuItems>

                <NavigationViewItem Icon="PhoneBook" Content="Annuaire général" Tag="AnnuaireGeneral"/>

                <NavigationViewItem Icon="PhoneBook" Content="Annuaire personnel" Tag="AnnuairePersonnel"/>

                <NavigationViewItem Content="Clavier" Tag="Clavier">
                    <NavigationViewItem.Icon>
                        <FontIcon Glyph="" FontFamily="Segoe MDL2 Assets"/>
                    </NavigationViewItem.Icon>
                </NavigationViewItem>

                <NavigationViewItem Content="Mode conférence" Tag="Conference">
                    <NavigationViewItem.Icon>
                        <FontIcon Glyph="" FontFamily="Segoe MDL2 Assets"/>
                    </NavigationViewItem.Icon>
                </NavigationViewItem>

                <NavigationViewItem Icon="Help" Content="Aide" Tag="Aide"/>

                <NavigationViewItem Icon="Admin" Content="Mode instructeur" Tag="Instructeur"/>

            </NavigationView.MenuItems>

            <Frame x:Name="ContentFrame"/>

        </NavigationView>

    </Grid>
</Page>

1 Ответ

1 голос
/ 15 мая 2019

Вы создаете новый экземпляр CallSection и затем вызываете метод UpdateEtablissementAppel этого.Это, очевидно, не повлияет на экземпляр, который вы видите на экране.Вам нужно получить ссылку на существующий экземпляр и вызвать его метод UpdateEtablissementAppel.

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

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

А затем разыграть Content из "CallsSection" Frame:

private void UpdateTextBox(string _UpdatePrefix, string _UpdateNumeroDestinataire)
{
    MainPage mainPage = FindParent<MainPage>(this);
    if (mainPage != null)
    {
        CallSection cellSection = mainPage.CallsSection.Content as CallSection;
        if (cellSection != null)
            cellSection.UpdateEtablissementAppel(_UpdatePrefix, _UpdateNumeroDestinataire);
    }
}

Вам также нужно сделать Frame доступным из других классов.Вы можете сделать это, возвращая ссылку на него из открытого свойства MainPage.xaml.cs или используя атрибут x: FieldModifier непосредственно в разметке XAML:

<Frame x:Name="CallsSection" x:FieldModifier="public" Grid.Column="1"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...