Блог программиста
21 добавил: 11/25/2012 10:40:53 PM

Нашел замечательную возможность создавать глобальные переменные и функции в WinRT приложениях.


Для этого в класс App нужно добавить:


public static new App Current
{
get { return Application.Current as App; }
}


и далее можно создать глобальную функцию или переменную:

  public static void globalfunc()
{

...
BlankPage pag = new BlankPage();

var fram = Window.Current.Content;
var fram2 = fram as frame;
pag = (BlankPage)fram2.Content;

...   

}


И вызывать ее из любого места кода:

App.globalfunc();

А как вас зовут?

Добавить комментарий

22 добавил: 12/25/2012 11:58:36 AM отредактировал: 10/21/2013 11:08:22 AM

Очень грустно мне было, когда я узнал, что в WinRT на C# нет FlyOut. Каким-то образом реализовал я ентот флайаут у себя в программе и сломал себе мозг пытаясь понять как же оно работает. А все-то оказалось просто. И сказать, что нет в WinRT на C# FlyOut совсем нельзя. Он довольно просто реализуется. :)

Сперва нужно создать UserControl, внутрь которого разместить Popup.

Далее в коде C# обработать все события открытия и закрытия.


Код C# ( сокращенно, но достаточно, чтобы передать суть ) :


public sealed partial class MyFlyoutUserControl : UserControl
{

// FlyoutState - is open or closed
public bool flState = false;

public MyFlyoutUserControl()
{
this.InitializeComponent();
}

public void OnClosingEvent(object sender)
{
try
{
flyoutPopup.IsOpen = false;
Canvas.SetLeft(flyoutPopup, Window.Current.Bounds.Width + 10);
flState = false;
}
catch { }
}

public void Show()
{

double ScreenW = Window.Current.Bounds.Width;
double ScreenH = Window.Current.Bounds.Height;
mainBorder.Width = 400;
mainBorder.Height = ScreenH;


flyoutPopup.IsOpen = true;
Canvas.SetLeft(flyoutPopup, ScreenW-400);
flState = true;

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
Window.Current.Activated += OnWindowActivated;
}

private void OnWindowActivated(object sender, Windows.UI.Core.WindowActivatedEventArgs e)
{
if (e.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated)
{
Hide();
}
}

private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
{
Hide();
}

public void Hide()
{
flState = false;
OnClosingEvent(this);
Window.Current.Activated -= OnWindowActivated;
Canvas.SetLeft(flyoutPopup, Window.Current.Bounds.Width);

Window.Current.CoreWindow.KeyDown -= CoreWindow_KeyDown;
Window.Current.Activated -= OnWindowActivated;
}

private void OnPopupClosed(object sender, object e)
{
Hide();
}
private void BackButton_Click(object sender, RoutedEventArgs e)
{
Hide();
  }


}


Открывается FlyOut довольно просто:


MyFlyoutUserControl f;

 f = new MyFlyoutUserControl();

f.Show();


Вобщем можете меня поздравить, - я изобрел FlyOut :]


Скачать пример можете по ссылке:

www.alexalex.ru/FlyOutExample.zip


 


А как вас зовут?

Добавить комментарий

Показать комментарии ( 2 )

Валентин А чем не устраивает:
Popup popup = new Popup();
??? ^^

Алексей Валентин, - все должно быть по гайдлайнам. Да и удобнее отдельным классом.

23 добавил: 3/24/2013 5:02:37 PM отредактировал: 4/2/2013 11:33:57 AM

Вкратце немного полезной информации о C# ( примеры не мои, но очень полезные - mustknow )
Асинхронность

  Task<string> task = new WebClient().DownloadStringTaskAsync("http://microsoft.com/");
  task.Wait(); // Здесь мы ждем завершения задачи, что блокирует поток
  TextBox.Text = task.Result;

Этот пример работает синхронно

try
   {
     TextBox.Text = await new WebClient().DownloadStringTaskAsync("http://not-habrahabr.ru/");
   }
   catch (Exception ex)
   {
     MessageBox.Show(ex.Message);
   }

…… // далее идет код, которые выполняется параллельно
Этот пример замечательно «ловит» исключение в асинхронном потоке идущем в основной функции

private void StartButtonClick(object sender, RoutedEventArgs e)
{
   try
   {     
     Download();     
   }
   catch (Exception ex)
   {
     MessageBox.Show(ex.Message);
   }
}
private async void Download()
{
   TextBox.Text = await new WebClient().DownloadStringTaskAsync("http://not-habrahabr.ru/");
}

А вот этот пример не «словит» исключение в методе Download(), так как сразу после вызова функции код продолжает выполняться.

Асинхронность позволяет производить параллельную обработку в одном потоке, следовательно асинхронный код не будет использовать все ядра вашего процессора - это минус.

Но, так как поток один, то вы можете делать параллельную обработку без блокировок (lock), то вам будет гораздо проще написать код без сложных ошибок межпоточного взаимодействия, а это большой плюс.

ЗАМЫКАНИЯ ( closures )


var funcs = new List<Func>();
for (int i = 0; i < 3; i++)
{
    funcs.Add(() => i);
}
foreach (var f in funcs)
    Console.WriteLine(f());

Выведет на экран 3 3 3 а не 1 2 3 как ожидается…
Данный результат обусловлен двумя причинами: (1) при замыканиях осуществляется захват переменных, а не значений переменных и (2) в приведенном фрагменте кода, существует один экземпляр переменной i, который изменяется на каждой итерации цикла, а не создается новый экземпляр на каждой итерации.

Исправить данную ситуацию довольно просто:
var funcs = new List<Func>();
for (int i = 0; i < 3; ++i)
{
    int tmp = i;
    funcs.Add(() => tmp);
}
foreach (var f in funcs)
    Console.WriteLine(f());


Внутренние функции ссылающиеся на локальные переменные своих внешних функций также создают замыкания. Пример на JavaScript:
function add (x) {
return function (y) {
return x + y;
};
}
var add5 = add(5);
var no8 = add5(3);
alert(no8); // Возвращает 8

Когда
А как вас зовут?

Добавить комментарий

24 добавил: 4/2/2013 1:22:56 PM отредактировал: 10/21/2013 11:13:49 AM

Очень приятные возможности CSS3 о которых много написано, но все-таки хотелось бы выделить вкратце для лучшего запоминания

h2~p {
  ⋮ объявления
}
< h2 >Заголовок< /h2 >
< p >Селектор выше соответствует этому параграфу< /p >
< p >Селектор выше соответствует этому параграфу< /p >

h2+p {
  ⋮ объявления
}
< h2 >Заголовок< /h2 >
< p >Селектор выше соответствует этому параграфу< /p >
< p >Селектор выше НЕ соответствует этому параграфу.< /p >

ul>li {
  ⋮ объявления
}
< ul >
< li >Селектор соответствует этому элементу< /li >
< li >
< ol >
< li >Не соответствует этому субэлементу< /li >
< li >Не соответствует этому субэлементу< /li >
< /ol >
< /li >
< /ul >

ul li {
  ⋮ объявления
}
< ul >
< li >Элемент 1< /li >
< li >
< ol >
< li >Субэлемент 2A< /li >
< li >Субэлемент 2B< /li >
< /ol >
< /li >
< /ul >
Селектор соответствует всем элементам

Этот пример добавит текст «Текст который был создан из CSS» цвета #cccccc, после тега span со значением class равным "cent":
span.cent:after {
  content: "Текст который был создан из CSS";
  color: #cccccc;
}

E[foo]     элемент E с атрибутом «foo»
E[foo="bar"]     элемент E аттрибут "foo" которого имеет значение равное "bar"    
E[foo^="bar"]     элемент E атрибут "foo" которого начинается с "bar"    
E[foo$="bar"]     элемент E атрибут "foo" которого заканчивается "bar"    
E[foo*="bar"]     элемент E атрибут "foo" которого содержит подстроку "bar"
E[foo|="en"]     элемент E атрибут "foo" которого содержит список значений, разделенных | начинающийся слева с "en"
E[foo~="bar"]     элемент E атрибут "foo" которого это список разделенных пробелом значений одно из которых равно "bar"

А как вас зовут?

Добавить комментарий

25 добавил: 4/2/2013 5:21:28 PM отредактировал: 10/21/2013 11:14:30 AM

То в JavaScript о чем очень часто все забывают    
Оператор "==" совершает преобразование типов. Следующие примеры возвращают TRUE даже если мы сравниваем строку и число:
    if (0 == '')
    if (0 == false)
    if (false == undefined)
    if ("\r\n" == 0)

Оператор же «===» проверяет что сравниваемые значения одного типа и возвращает FALSE:
    if ('5' === 5)
    if (0 === '')
    if (0 === false)
    if (false === undefined)
    if ("\r\n" === 0)
А как вас зовут?

Добавить комментарий

«  1 2 3 4 5 6 7  ...  » 

На сайт AlexAlex.ru