Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Вопрос + ответ = Совет

Узнать имя сотового оператора

Для определения сотового оператора воспользуйтесь свойством CellularMobileOperator класса DeviceNetworkInformation из пространства имен Microsoft.Phone.Net.NetworkInformation:


System.Text.StringBuilder sb = new System.Text.StringBuilder();

sb.Append("Сотовый оператор:  ");
sb.AppendLine(Microsoft.Phone.Net.NetworkInformation.DeviceNetworkInformation.CellularMobileOperator);

MessageBox.Show(sb.ToString());

Как установить Windows Phone Developer Tools на Windows Server 2008?

Официально Windows Phone Developer Tools поддерживает только Windows Vista и Windows 7. При попытке установить на Windows Server 2008 мы получаем ошибку. Чтобы решить данную проблему сделайте следующее:

  • Скачайте Windows Phone Developer Tools web загрузчик и сохраните его на жестком диске;
  • Распакуйте установщик командой vm_web.exe /x;
  • Откройте в текстовом редакторе файл baseline.dat;
  • Найдите секцию [gencomp7788];
  • Измените значение InstallOnLHS с 1 на 0;
  • Измените значение InstallOnWin7Server с 1 на 0;
  • Сохраните изменения в файле baseline.dat;
  • Запустите установку командой setup.exe /web;

Как получить номер версии приложения


using System.Reflection;

var CurrentAssembly = Assembly.GetExecutingAssembly().FullName;
string VersionNumber = "Version=  " + CurrentAssembly.Split('=')[1].Split(',')[0];
MessageBox.Show(VersionNumber);

Как развернуть страницу на весь экран?

В Windows Phone 7 в верхней части имеется системная область, на которой выводится информация о силе сигнала и уровне заряда аккумулятора. Вы можете избавиться от этой области при запуске своей программы.

Для этого нужно установить видимость SystemTray в значение false. SystemTray является статическим классом пространства имен Microsoft.Phone.Shell и имеет свойство IsVisible:


[C#]
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
    SystemTray.IsVisible = false;
}

Можно добиться такого же эффекта через XAML:


<phone:PhoneApplicationPage
  ...
  shell:SystemTray.IsVisible="False"
  ...
>

Как открыть Marketplace из браузера или почты на Windows Phone 7?

Чтобы открыть Marketplace по ссылке в бразуре нужно использовать формат:

zune://navigate/?appID=3cc99ca6-f0e6-df11-a844-00237de2db9e

Этот же способ сработает и на настольном компьютере, если установлен Zune.

Для проверки на эмуляторе и устройсте - zune://navigate/?appID=3cc99ca6-f0e6-df11-a844-00237de2db9e

Как сменить ориентацию устройства в проекте?

При открытии проекта в режиме Design, Visual Studio выводит на экран изображение устройства. Вы можете сменить ориентацию устройства, если вам изначально хочется работать в другом режиме. При смене ориентации Visual Studio автоматически обновить высоту и ширину страницы приложения. Для смены ориентации щелкните правой кнопкой мыши на изображении устройства и выберите из меню команду Switch to Landscape или Switch to Portrait в зависимости от текущей ориентации.

Обратите внимание, что эмулятор всегда запускается в портретном режиме. Для изменения ориентации экрана в эмуляторе читайте статью Эмулятор Windows Phone 7

Как отключить блокировку экрана во время отладки программы

Если в настройках устройства включена блокировка экрана, то это может мешать отлаживать программу. Для отключения блокировки экрана используйте код:


if (System.Diagnostics.Debugger.IsAttached)
{
    PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
}

Естественно, если вы хотите проверить, как поведет себя программа при включенной блокировке экрана, то данный код нужно убрать.

Как отслеживать состояние сети

Для проверки доступности сети вы можете вызвать следующую функцию из пространства имен System.Net.NetworkInformation:


bool isConnected = NetworkInterface.GetIsNetworkAvailable();

Кроме того, вы можете использовать событие, которое будет вызвано, когда состояние сети изменится:


NetworkChange.NetworkAddressChanged += 
new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

Как определить уникальный идентификатор телефона и пользователя

Если вам нужно определить уникальный идентификатор телефона, на котором запущена программа, то используйте класс DeviceExtendedProperties из пространства имен Microsoft.Phone.Info:


using Microsoft.Phone.Info;

byte[] id = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
string strDevID = BitConverter.ToString(id);
MessageTextBox.Text = strDevID;

"DeviceUniqueID" возвращает byte-массив длинною в 20 байтов. Выглядит он примерно так:


"4A-9C-89-A6-F6-CF-93-42-53-A1-82-7F-54-FA-31-39-E0-5B-95-0B"

Если вы хотите определить уникального пользователя, вместо устройства, то это делается с помощью класса UserExtendedProperties того же пространства имен (работает только на реальном устройстве):


string anid = UserExtendedProperties.GetValue("ANID") as string;
string anonymousUserId = anid.Substring(2, 32);

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

Память

Одно из требований к приложениям, которые загружаются на Marketplace - приложение не должно занимать более 90 Мб памяти. Для проверки, сколько памяти занимает ваше приложение используйте свойства из DeviceExtendedProperties. DeviceTotalMemory выдает общую размер памяти на устройстве в байтах, ApplicationCurrentMemoryUsage возвращает используемую память вашим приложением. ApplicationPeakMemoryUsage сообщает о пиковом значении используемой памяти.


using Microsoft.Phone.Info;

// Общая память на устройстве
var maxmem = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");
maxmem /= 1024 * 1024;
textBlockGetTotalMemory.Text = maxmem.ToString();

void timer_Tick(object sender, EventArgs e)
{
    try
    {
        textBlockGetCurrentMemory.Text = DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage").ToString();
        textBlockGetPeakMemory.Text = DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage").ToString();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Какая тема (темная или светлая) используется на устройстве

Вот один из примеров, основанный на проверке ресурса PhoneLightThemeVisibility или PhoneDarkThemeVisibility. Если используется светлая тема, то можно переключиться на другую версию картинки или использовать другие сочетания цвета фона и текста в вашем приложении (см. закомментированный код).


Visibility v = (Visibility)Resources["PhoneLightThemeVisibility"]; 
if (v == System.Windows.Visibility.Visible) 
{ 
    //ImageBrush ib = new ImageBrush(); 
    //Uri u = new Uri("PanoramaBack2.png", UriKind.Relative); 
    //ib.ImageSource = new System.Windows.Media.Imaging.BitmapImage(u); 
    //PanoramaControl.Background = ib; 
    PageTitle.Text = "Theme: Light";  // выводим сообщение, что тема светлая
}

Для истории: В бета-версии приходилось проверять PhoneForegroundColor следующим образом:


Color themeColor = (Color)Application.Current.Resources["PhoneForegroundColor"];      
if (themeColor.ToString() == "#FFFFFFFF") …

Как закрепить приложение в эмуляторе?

Чтобы закрепить приложение на главной странице Start, найдите значок вашей программы в эмуляторе и через контекстное меню выберите команду pin to start

Как определить разрешение используемого устройства?

Воспользуйтесь свойствами ActualHeight и ActualWidth


double h = (App.Current.RootVisual as FrameworkElement).ActualHeight;
double w = (App.Current.RootVisual as FrameworkElement).ActualWidth;

textBox1.Text = h.ToString() + "x" + w.ToString();

Или так


string ScreenWidth = Application.Current.Host.Content.ActualWidth.ToString();
string ScreenHeight = Application.Current.Host.Content.ActualHeight.ToString();
textBox1.Text = ScreenHeight + "x" + ScreenWidth;

Как подключить камеру в эмуляторе?

В эмуляторе камера не поддерживается.

Поддерживается ли формат BMP?

Нет, BMP не поддерживается. Используйте форматы JPG и PNG.

Как узнать, где запущена программа - на эмуляторе или на устройстве?

Воспользуйтесь перечислением DeviceType


textBox1.Text = System.Environment.DeviceType.ToString(); // возвращает Emulator, Device, Unknown
Реклама