Ре: ответ Chris
Ваша реализация позволяют нам вещи как "1a" или "b2" через. Как насчет этого вместо этого:
def safeParse2(strToParse)
if strToParse =~ /\A\d+\Z/
strToParse.to_i
else
raise Exception
end
end
["100", "1a", "b2", "t"].each do |number|
begin
puts safeParse2(number)
rescue Exception
puts "#{number} is invalid"
end
end
Это производит:
100
1a is invalid
b2 is invalid
t is invalid
Предполагая, что ваш класс данных выглядит примерно так:
public class TimeLineEntry
{
public string Name { get; set; }
public DateTime Start { get; set; }
public int Index { get; set; }
public int Duration { get; set; }
}
Вы можете использовать ItemsControl
для размещения записей в виде прямоугольников.
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding Path=Start, Converter={StaticResource timeToPositionConverter}}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Index, Converter={StaticResource indexToPositionConverter}}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="TimeLineEntry">
<Rectangle Width="{Binding Duration}" Height="10" ToolTip="{Binding Name}" Fill="Red" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
В приведенном выше коде XAML панель ItemsControl (который является базовым классом ListBox, ListView и т. д.) изменен на Canvas
для лучшего позиционирования элементов.
Вы можете использовать ItemsControl.ItemTemplate для настройки способа отображения элементов.
Я связал свойства Start и Index класса TimeLineEntry с вложенными свойствами Canvas.Left и Canvas.Top для ItemContainer, и я также использовал преобразователи значений для преобразования значений DateTime в позиции пикселей.
Код для преобразователей значений прост .
public class IndexToPositionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is int)
{
return ((int)value) * 10;
}
return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}