Gyakorlat: A telefonszám-fordító alkalmazás létrehozása
Ebben a gyakorlatban összeállítja a telefonos tárcsázó alkalmazás felhasználói felületét, és implementálja a felhasználói felület mögötti logikát.
Olyan felhasználói felületet fog létrehozni, amely kihasználja a .NET MAUI és a .NET MAUI Essentials csomag felhasználói felületi képességeit a telefon tárcsázásához.
Az alkalmazás lehetővé teszi, hogy a felhasználó szöveget írjon be egy beviteli mezőbe, és ezt a szöveget numerikus számjegyekre fordítja. A fordítás alapjaként a telefonbillentyűzeten megjelenő betűket fogja használni. A levélfülke például 222-etjelent, mivel a 2. számjegy mind a három a, b és c betűvel rendelkezik.
Az előző gyakorlatban létrehozott Telefon word megoldást fogja használni.
Új C#-forrásfájl hozzáadása az alkalmazáshoz
Nyissa meg a Telefon word megoldást a Visual Studióban, ha még nem nyitotta meg.
A Megoldáskezelő ablakban kattintson a jobb gombbal a Telefon word projektre, válassza a Hozzáadás, majd az Osztály lehetőséget.
Az Új elem hozzáadása párbeszédpanelen nevezze el az osztályfájlt Telefon wordTranslator.cs, majd válassza a Hozzáadás lehetőséget.
A fordítási logika hozzáadása
Cserélje le az osztályfájl tartalmát a következő kódra, és mentse a fájlt. Az osztály statikus metódusa ToNumber
PhonewordTranslator
a számot alfanumerikus szövegből normál numerikus telefonszámmá fordítja.
using System.Text;
namespace Core;
public static class PhonewordTranslator
{
public static string ToNumber(string raw)
{
if (string.IsNullOrWhiteSpace(raw))
return null;
raw = raw.ToUpperInvariant();
var newNumber = new StringBuilder();
foreach (var c in raw)
{
if (" -0123456789".Contains(c))
newNumber.Append(c);
else
{
var result = TranslateToNumber(c);
if (result != null)
newNumber.Append(result);
// Bad character?
else
return null;
}
}
return newNumber.ToString();
}
static bool Contains(this string keyString, char c)
{
return keyString.IndexOf(c) >= 0;
}
static readonly string[] digits = {
"ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
};
static int? TranslateToNumber(char c)
{
for (int i = 0; i < digits.Length; i++)
{
if (digits[i].Contains(c))
return 2 + i;
}
return null;
}
}
A felhasználói felület létrehozása
Nyissa meg a MainPage.xaml fájlt a Telefon word projektben.
Távolítsa el a vezérlőt
ScrollView
és annak tartalmát, és hagyja csak a vezérlőtContentPage
:<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Phoneword.MainPage"> </ContentPage>
Adjon hozzá egy
VerticalStackLayout
függőleges tájolású és 15 egységből álló térközt tartalmazó vezérlőt, és 20 egység kitöltésével a ContentPage-be:<ContentPage ... > <VerticalStackLayout Spacing="15" Padding="20"> </VerticalStackLayout> </ContentPage>
Label
Vezérlőelem hozzáadása a StackLayouthoz:<ContentPage ... > <VerticalStackLayout ...> <Label Text = "Enter a Phoneword" FontSize ="20"/> </VerticalStackLayout> </ContentPage>
Adjon hozzá egy vezérlőt
Entry
a StackLayouthoz a címke alatt. AEntry
vezérlők egy szövegmezőt biztosítanak, amelybe a felhasználó adatokat írhat be. Ebben a kódban a tulajdonságx:Name
nevet ad a vezérlőnek. Erre a vezérlőre később hivatkozni fog az alkalmazás kódjában:<ContentPage ... > <VerticalStackLayout ...> <Label .../> <Entry x:Name = "PhoneNumberText" Text = "1-555-NETMAUI" /> </VerticalStackLayout> </ContentPage>
Adjon hozzá két
Button
vezérlőt a VerticalStackLayout elemhez a Bejegyzés vezérlőelem után. Mindkét gomb jelenleg nem tesz semmit, a második pedig kezdetben le van tiltva. A következő feladatban a következő két gomb eseményének kezeléséreClicked
szolgáló kódot fogja hozzáadni:<ContentPage ... > <VerticalStackLayout ...> <Label .../> <Entry ... /> <Button x:Name = "TranslateButton" Text = "Translate" Clicked = "OnTranslate"/> <Button x:Name = "CallButton" Text = "Call" IsEnabled = "False" Clicked = "OnCall"/> </VerticalStackLayout> </ContentPage>
Válasz a TranslateButton gombra koppintva
Az Megoldáskezelő ablakban bontsa ki a MainPage.xaml bejegyzést, és nyissa meg a MainPage.xaml.cs kód mögötti fájlt.
Az osztályban
MainPage
távolítsa el a változótcount
és a metódustOnCounterClicked
. Az osztálynak így kell kinéznie:namespace Phoneword; public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } }
Adja hozzá a sztringváltozót
translatedNumber
és a következőOnTranslate
metódust azMainPage
osztályhoz a konstruktor után. AOnTranslate
metódus lekéri a telefonszámot aText
Entry
vezérlő tulajdonságából, és átadja a korábban létrehozott osztály statikusToNumber
metódusánakPhonewordTranslator
.public partial class MainPage : ContentPage { ... string translatedNumber; private void OnTranslate(object sender, EventArgs e) { string enteredNumber = PhoneNumberText.Text; translatedNumber = Core.PhonewordTranslator.ToNumber(enteredNumber); if (!string.IsNullOrEmpty(translatedNumber)) { // TODO: } else { // TODO: } } }
Megjegyzés:
A kód hiányzó TODO-bitjei a következő lépésben lesznek kitöltve.
OnTranslate
A metódusban adjon hozzá kódot aText
Hívás gomb tulajdonságának módosításához, hogy a sikeres fordításkor a telefonszámot is tartalmazza. A translatedNumber mezőben tárolt értéket használhatja. Emellett engedélyezze és tiltsa le a gombot a sikeres fordítás alapján. Ha például null értéketTranslateNumber
ad vissza, tiltsa le a gombot, de ha sikeres volt, engedélyezze.private void OnTranslate(object sender, EventArgs e) { string enteredNumber = PhoneNumberText.Text; translatedNumber = Core.PhonewordTranslator.ToNumber(enteredNumber); if (!string.IsNullOrEmpty(translatedNumber)) { CallButton.IsEnabled = true; CallButton.Text = "Call " + translatedNumber; } else { CallButton.IsEnabled = false; CallButton.Text = "Call"; } }
A CallButton gomb eseménymetódusának létrehozása
Adja hozzá az
OnCall
eseménykezelési módszert azMainPage
osztály végéhez. Ez a módszer aszinkron műveleteket használ, ezért jelölje meg a következőkéntasync
:public partial class MainPage : ContentPage { ... async void OnCall(object sender, System.EventArgs e) { } }
A metódusban
OnCall
kérje meg a felhasználót a Page.DisplayAlert metódussal, hogy megkérdezze, szeretné-e tárcsázni a számot.A paraméterek
DisplayAlert
egy cím, egy üzenet és két sztring, amelyeket az Elfogadás és a Mégse gomb szövegéhez használnak. Egy logikai értéket ad vissza, amely jelzi, hogy az Elfogadás gomb lenyomva lett-e a párbeszédpanel bezárásához.async void OnCall(object sender, System.EventArgs e) { if (await this.DisplayAlert( "Dial a Number", "Would you like to call " + translatedNumber + "?", "Yes", "No")) { // TODO: dial the phone } }
Az alkalmazás tesztelése
A Visual Studio eszköztárán válassza ki a Windows Machine-profilt , és kezdje el a hibakeresést.
Koppintson a Fordítás gombra az alapértelmezett szöveg érvényes telefonszámmá alakításához. A Hívás gomb képaláírás az 1-555-6386284-os telefonszámra kell váltania:
Koppintson a Hívás gombra. Ellenőrizze, hogy megjelenik-e egy üzenet, amely a művelet megerősítését kéri. Válassza a Nem lehetőséget.
Térjen vissza a Visual Studióba, és állítsa le a hibakeresést.
Tárcsázza a telefonszámot
A MainPage.xaml.cs kód mögötti fájlban szerkessze az OnCall metódust, és cserélje le a TODO megjegyzést a következő
try/catch
blokkokra:async void OnCall(object sender, System.EventArgs e) { if (await this.DisplayAlert( "Dial a Number", "Would you like to call " + translatedNumber + "?", "Yes", "No")) { try { if (PhoneDialer.Default.IsSupported) PhoneDialer.Default.Open(translatedNumber); } catch (ArgumentNullException) { await DisplayAlert("Unable to dial", "Phone number was not valid.", "OK"); } catch (Exception) { // Other error has occurred. await DisplayAlert("Unable to dial", "Phone dialing failed.", "OK"); } } }
A Microsoft.Maui.ApplicationModel.Communication névtér Telefon Dialer osztálya absztrakciót biztosít a Windows, Android, iOS (és iPadOS) telefonok tárcsázási funkcióinak (és egyéb funkcióinak) és a macOS-platformoknak. A statikus Open metódus a tárcsázó segítségével próbálja meg meghívni a paraméterként megadott számot.
Az alábbi lépések bemutatják, hogyan frissítheti az Android-alkalmazásjegyzéket, hogy az Android használhassa a tárcsázót. A Windows, az iOS és a MacCatalyst alkalmazások ugyanazt az általános elvet követik, azzal a különbséggel, hogy a jegyzékben más operációsrendszer-függő képességet kell megadni.
A Megoldáskezelő ablakban bontsa ki a Platformok mappát, bontsa ki az Android mappát, kattintson a jobb gombbal az AndroidManifest.xml fájlra, és válassza a Megnyitás automatikus szerkesztőválasztóval>(XML) lehetőséget. Válassza az OK lehetőséget.
Adja hozzá a következő XML-kódrészletet a jegyzékcsomóponton belül, a csomópont meglévő tartalma után.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> ... <queries> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel"/> </intent> </queries> </manifest>
Mentse a fájlt.
A Visual Studio eszköztárán válassza ki az Android Emulators/Pixel 3a – API 30 (vagy hasonló) profilt, és kezdje el a hibakeresést.
Amikor az alkalmazás megjelenik az emulátorban (ez eltarthat néhány percig), adjon meg egy telefonszámot (vagy fogadja el az alapértelmezettet) válassza a Fordítás lehetőséget, majd válassza a Hívás lehetőséget.
A Szám tárcsázása riasztásban válassza az Igen lehetőséget. Ellenőrizze, hogy megjelenik-e az Android-telefon tárcsázó az alkalmazásban megadott számmal.
Térjen vissza a Visual Studióba, és állítsa le a hibakeresést.
Összesítés
Ebben a gyakorlatban egy egyéni felhasználói felületet adott hozzá az alkalmazáshoz oldalak és nézetek használatával. Emellett az Androidban elérhető platformspecifikus API-k használatával támogatást is adott a hívások indításához.