среда, 6 июня 2012 г.

.NET C# - Typesafe Enum Pattern

Недавно понадобилось сделать перечисление со строками. Перечисления в .NET поддерживают только численные типы (byte, sbyte, short, ushort, int, uint, long, ulong) но к сожалению не поддерживают конструкцию типа
enum ImagePath : string
{
    BIcon = "Images/BIcon.jpg",
    PIcon = "Images/PIcon.jpg",
    GIcon = "Images/GIcon.jpg"
}
Но выход есть!

пятница, 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>