пятница, 1 июня 2012 г.

WPF - Установка Image.Source через код

Предположим вот такую разметку:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow">
        <Image Height="55" Width="55" HorizontalAlignment="Left" Name="img" Stretch="Fill" VerticalAlignment="Top"  />
    </Grid>
</Window>
   
Как мы в этом случае установили бы атрибут Source для указания на нужную для отображения картинку? Нет ничего проще, чем сделать это непосредственно в самой разметке, где мы задаем атрибут Source и указываем путь к изображению.
<Image Source="Images/PIcon.jpg" Height="55" Width="55" HorizontalAlignment="Left" Name="img" Stretch="Fill" VerticalAlignment="Top"  />
В данном случае картинка располагается в папке Images, которая в свою очередь находится в корне всего проекта. Все это конечно прекрасно но что если мы хотим установить путь к картинке из кода? Первым, пришедшим мне в голову решением, был следующий фрагмент кода
img.Source = "Images/PIcon";
Упс! Такая запись в корне неверна. И какая же удовлетворит WPF?

WPF - Добавление элементов через код

Итак, предположим у нас имеется вот такая вот начальная разметка XAML:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow" />
</Window>

Наша цель добавить элемент, ну например Button, в дискриптор Grid'а. То есть, чтобы во время выполнения программы, разметка приняла вот такой вид:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow">
        <Button Content="Press me" Width="75" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="100,50,0,0" />
    </Grid>
</Window>

пятница, 18 мая 2012 г.

.NET C# - Multicast Delegates (Part 1)

Все делегаты в C# наследуются от MulticastDelegate класса (который в свою очередь наследуется от базового класса делегатов Delegate). MulticastDelegate содержит в себе массив объектов Delegate. Это означает то, что любой делегат может содержать в себе ссылки на множество методов. Для того чтобы получить список всех методов в каком-либо объекте делегата, необходимо вызвать метод GetInvocationList(). Перейдем к примерам.

четверг, 17 мая 2012 г.

.NET C# - Отправка e-mail'а

Отправляем e-mail на примере яндекса. Необходимые классы находятся в System.Net.Mail.
static void SendEmail()
{
    MailAddress from = new MailAddress("addressFrom@yandex.ru", "Display Message", Encoding.UTF8);
    MailAddress to = new MailAddress("addressTo@yandex.ru");

    using (SmtpClient client = new SmtpClient(@"smtp.yandex.ru"))
       using(MailMessage message = new MailMessage(from, to))
       {
           client.Credentials = new NetworkCredential("userName", "userPassword");

           message.Body = "This is a test e-mail message sent by an application. ";
           message.Body += "Hello wanderer!";
           message.BodyEncoding = Encoding.UTF8;
           message.Subject = "Important note!";
           message.SubjectEncoding = Encoding.UTF8;

           // Optional
           //message.Attachments.Add(new Attachment("D:\\AwesomePicture.gif"));

           client.Send(message);
       }
} 

среда, 16 мая 2012 г.

.NET C# - Замыкания

Реализация замыканий в C# реализована таким образом, что при захвате внешней переменной (по отношению к анонимному методу) захватывается сама переменная, а не ее значение в момент непосредственного захвата. Пример:
static void Main()
{
      int num = 1;
      Action action = () => Console.WriteLine(num);
      num = 2;
      action(); // Outputs: 2
}