WPF управляют руководством дизайна - временная шкала

Ре: ответ 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

5
задан ZombieSheep 7 December 2009 в 14:22
поделиться

1 ответ

Предполагая, что ваш класс данных выглядит примерно так:

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();
    }
}
9
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: