xaml schedule控制如何处理持续时间差异很大的项目

时间:2014-03-11 14:22:33

标签: wpf xaml wpf-controls

我必须使用WPF XAML创建一个计划控件,用于显示持续时间仅为1秒且可能长达几小时的项目。

第一件看起来很清楚的事情是,我需要某种缩放功能,用于钻进持续时间很短的物品,然后缩小以查看持续时间非常长的物品。

我有一种UI风格,当控件被缩放以查看大项目时,通常在大持续时间项目之间出现的任何小持续时间项目都会被收集到一个桶中。其高度> =最小显示高度。这样我就可以将鼠标悬停在这个桶上并获得一个工具提示,它将包含的项目呈现为时间顺序列表视图。

我不知道从哪里开始。我觉得我可以在自定义面板的Measure / Arrange覆盖中实现某些功能。但我认为这可能会对渲染性能产生不利影响。如果我这样做的话,我想我需要注入一个“桶”。查看面板子集合,但这会破坏我的自定义项控件中的ItemTemplate的使用吗?

我的第二个问题是我创建了一个自定义的可观察集合,它具有一个可绑定的Scale属性,然后将该集合组织到“桶”中。持续时间大到可以显示。

有没有人对如何最好地解决这个问题有任何想法?

2 个答案:

答案 0 :(得分:1)

我做了一个类似的声音控制,实际上用于输入员工的时间班次。它在绑定到ObservableCollection属性的ListBox.ItemsSource数据中使用简单数据类型。我定义了一个DataTemplate来设计UI中每个时间段的外观。它看起来像这样:

enter image description here

顶部有一些ComboBox es,当更改时,会更改集合中的项目数。因此,例如,当Minutes/segment ComboBox值更改为Thirty时,UI中显示两倍(相同大小)项目的数量,现在每个项目与30分钟相关,而不是60分钟。这是通过简单地调用从相关属性设置器重新填充集合的方法来完成的。这是一个例子:

public TimeSegmentDivision MinutesPerSegment
{
    get { return minutesPerSegment; }
    set
    {
        minutesPerSegment = value;
        InitializeTimeSegmentsRowViewModels();
        NotifyPropertyChanged("MinutesPerSegment");
    }
}

private void InitializeTimeSegmentsRowViewModels()
{
    if (DayCount == 5) AdjustStartDate();  // (DayCount == 5 is 'Monday - Friday')
    DateTime tempDate = Date;
    AllTimeSegments = new TimeSegmentsCollection();
    for (int m = 0; m < DayCount; m++)
    {
        TimeSegmentsRowViewModel viewModel = new TimeSegmentsRowViewModel();
        viewModel.TimeSegments = InitializeTimeSegments();
        AllTimeSegments.Add(viewModel);
        date = Date.AddDays(1);
    }
    NotifyPropertyChanged("AllTimeSegments");
    date = tempDate;
}

InitializeTimeSegmentsRowViewModels方法的细节在这里并不重要,但你应该能够从这个例子中得到正确的想法。

答案 1 :(得分:1)

我参与了Silverlight的自定义计划。它有类似的布局加载过程,所以我会尝试回答。 我猜你的主要问题在于&#39;时间栏&#39; ...不要再把时间安排视为一致的大控件,它是一些自定义控件。看看网格。这种控制有很多和平。 一开始我们必须解决第一个问题 - 时间栏。正确的实施将带领您走向无痛的未来)))因此,时间限制它包含一些控制,其中包含员工的总时间或持续时间(此值可由用户设置)。像步骤这样的事情,确切的步骤和持续时间将告诉你劳动力的大小和位置。对于时间条控制步骤将告知应在哪里显示视觉滴答。我的意思是时间栏看起来像统治者,但时间值而不是英寸。所以我们得到了下一个问题 - 如何将时间转换为像素?不幸的是我没有找到最佳解决方案 - 我假设1分钟等于1.6像素这对我来说很完美......但是你会有动态值来动态增加或减少步长的像素长度。所以我们有足够的持续时间,我们可以将其转换为像素长度。但总长度可能比可用尺寸大得多。那么,现在我们有另一个时间栏属性 - 视觉持续时间...... 好吧,我猜你理解我的思维方式......改变步长的像素大小你会得到完美的变焦(不是步长时间,而是像素长度)。 是的,如果您想创建具有高估度量/排列方法的自定义面板,那么您就是正确的方法。并且不用担心项目模板。这是最容易的部分。您的父计划控件将具有对象类型的项源属性。你所有的工作都是内容控制......