Wpf xaml计划控制如何处理持续时间相差很大的项目

Wpf xaml计划控制如何处理持续时间相差很大的项目,wpf,xaml,wpf-controls,Wpf,Xaml,Wpf Controls,我必须使用WPF XAML创建一个时间表控件,用于显示持续时间仅为1秒、可能长达几个小时的项目 第一件似乎很清楚的事情是,我需要某种缩放功能,以便钻取持续时间非常短的项目,并缩小以查看持续时间非常长的项目 我有一个UI风格,当控件被缩放以查看大项目时,通常出现在大项目之间的任何小项目都会被收集到一个高度>=最小显示高度的“bucket”中。因此,我可能可以将鼠标悬停在这个bucket上,并获得一个工具提示,将包含的项呈现到一个按时间顺序排列的列表视图中 我不知道从哪里开始。我觉得我或许可以在测量

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

第一件似乎很清楚的事情是,我需要某种缩放功能,以便钻取持续时间非常短的项目,并缩小以查看持续时间非常长的项目

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

我不知道从哪里开始。我觉得我或许可以在测量/安排自定义面板的覆盖方面取得一些成就。但我认为这可能会对渲染性能产生不利影响。如果我这样做,我想我需要在panels children集合中插入一个“bucket”视图,但这会破坏我的自定义项控件中ItemTemplate的使用吗

我的第二个想法是,我创建了一个定制的可观察集合,该集合具有可绑定的比例属性,然后将集合组织成持续时间足够长的“bucket”,以便可以显示


有人对我应该如何最好地解决这个问题有什么想法吗?

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

顶部有一些
组合框
e,它们在更改时会更改集合中的项目数。因此,例如,当
Minutes/segment组合框
值更改为
three
时,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;
}
public TimeSegmentDivision MinutesPerSegment
{
获取{return minutesPerSegment;}
设置
{
分钟间隔=数值;
InitializeTimeSegmentsRowViewModels();
NotifyPropertyChanged(“MinutesPerSegment”);
}
}
私有void InitializeTimeSegmentsRowViewModels()
{
如果(DayCount==5)AdjustStartDate();/(DayCount==5是“星期一-星期五”)
DateTime tempDate=日期;
AllTimeSegments=新的TimeSegmentsCollection();
对于(int m=0;m

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

我为Silverlight定制了时间表。它有类似的布局加载过程,所以我会尝试回答。 我想你的主要问题在于“时间条”。。。不要把schedule看作是一个大的一致性控件,它是一些自定义控件包。看看网格。这种控制有很多好处。 一开始我们要解决第一道题——时间吧。正确的实现将使您获得无痛的未来(时间条),所以时间条是一些包含总时间或员工劳动持续时间的控件(该值可由用户设置)。而像步骤这样的事情,确切的步骤和持续时间会告诉你们劳动力的大小和位置。对于时间条,控制步骤将告诉应在何处显示可视标记。我的意思是时间条看起来像尺子,但是有时间值而不是英寸。所以我们面临下一个问题——如何将时间转换成像素?不幸的是,我没有找到最好的解决方案-我假设1分钟等于1.6像素,这对我来说是完美的。。。但您将具有动态值,该值将动态增加或减少步长的像素长度。所以我们有总的持续时间,我们可以把它转换成像素的长度。但总长度可能比可用尺寸大得多。所以,现在我们有了另一个时间条属性-视觉持续时间。。。 好吧,我想你明白我的想法。。。改变步长的像素大小可以获得完美的缩放效果(不是步长时间大小,而是像素长度)。
是的,如果您想使用高估的measure\arrange方法创建自定义面板,您的方法是正确的。不要担心项目模板。这是最简单的部分。父计划控件将具有对象类型的items源属性。你所有的工作都是内容控制……

第二种方法在我看来更好。我已经制作了各种各样的定制WPF UI,而且没有一次需要创建任何定制面板之类的东西。无论如何。。你的问题有点含糊。。也许你可以发布一个屏幕截图或一段相关的XAML?目前我既没有代码也没有输出示例,我仍在尝试找出最佳方法,但随着时间的推移,我觉得定制的可观察集合可能是正确的方法。我只是想了解一下解决这个问题的最佳架构类型,但是如果有人对它感兴趣,我将详细介绍我最终为实现我的目标所做的工作。谢谢你的输入。谢谢,我遵循了你的想法,有一个用户体验,可以根据上一个答案缩放时间头和时间项。如何处理在outlook calander中同时发生的计划项目:它将这些项目并排放置在给定的DayView中。我想这需要一个专门的物品来源