Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF应用程序中尝试在屏幕上设置网格线的动画,并检测一次可以在屏幕上显示多少条网格线_C#_Wpf - Fatal编程技术网

C# 在WPF应用程序中尝试在屏幕上设置网格线的动画,并检测一次可以在屏幕上显示多少条网格线

C# 在WPF应用程序中尝试在屏幕上设置网格线的动画,并检测一次可以在屏幕上显示多少条网格线,c#,wpf,C#,Wpf,我正在创建一个显示在餐馆电视屏幕上的食物菜单。菜单itmes将没有交互,因此我需要自动显示项目,并在所有项目不能同时显示在屏幕上时通过它们进行旋转 我已经构建了项目的所有组件,甚至包括菜单项是什么以及在哪一天显示它们的管理。现在,我需要完成电视屏幕项目的显示 我是WPF的新手,所以我正在尝试找出最好的方法: 菜单项与项目名称以及卡路里、蛋白质、脂肪和胆固醇一起列出。因此,它们需要显示在网格中 没有用户与菜单的交互,因此我需要确保我能够正确地将项目列表分解为“页面”,在显示几秒钟后,这些页面在屏幕

我正在创建一个显示在餐馆电视屏幕上的食物菜单。菜单itmes将没有交互,因此我需要自动显示项目,并在所有项目不能同时显示在屏幕上时通过它们进行旋转

我已经构建了项目的所有组件,甚至包括菜单项是什么以及在哪一天显示它们的管理。现在,我需要完成电视屏幕项目的显示

我是WPF的新手,所以我正在尝试找出最好的方法:

  • 菜单项与项目名称以及卡路里、蛋白质、脂肪和胆固醇一起列出。因此,它们需要显示在网格中
  • 没有用户与菜单的交互,因此我需要确保我能够正确地将项目列表分解为“页面”,在显示几秒钟后,这些页面在屏幕上和屏幕下都会显示动画。我考虑这样做的方式是在视图中添加每个项目,并评估其下方有多少可用空间。如果空间小于某一高度,其余菜单项将排队等待在下一“页面”上显示。最好是让每一行项目从左边快速滑入,让它们在1-2秒内全部显示在屏幕上
  • 显示它们的最佳控件是什么?也许是一个ItemsControl
  • 如果你们有什么好主意能给我指出正确的方向,我将不胜感激


    更新:这是我所说内容的一个非常粗略的模型:

    您可能不需要使用网格或堆栈面板,就可以对元素的边距值设置动画(使用负边距将项目滑入)。您需要确保父元素的ClipToBounds设置为false,以便可以在其边界之外绘制项目


    要测量元素的高度,只需使用row元素上的测量方法来计算它在垂直方向上需要多少空间。基于此,您可以确定一个页面中可以容纳多少元素。

    构建所有内容的工作量太大,但是以下几点应该可以引导您实现目标:

    从Listview继承添加创建“PartialListView”,并添加依赖项属性StartIndex和ItemHeight。它应该构建一个适当高度的列表视图,显示从StartIndex到StartIndex+ItemHeight的项目。(未显示滚动条。加载listView后,使用FindDescentant(类型为scrollviewer)查找滚动条查看器,并设置其垂直偏移)

    创建具有两个依赖项属性的UserControl:
    1) 绑定到可观察到的菜单项集合(项目、卡路里等)
    2) ItemHeight(整数属性)

    然后在每次集合更改时修改IndexList,这是一个可观察的数字集合{1,6,11},是每个菜单的第一个索引

    控制代码如下所示:

                <ListBox ItemsSource="{Binding IndexList, ElementName = mycontrolname}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <ScrollViewer x:Name="PageScroller"  ... set to horizontal only, not
                                     showing any bar > 
                            <StackPanel Orientation="Horizontal" />
                            </ScrollViewer> 
                       </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                        <ListBox.ItemTemplate>
                    <DataTemplate>
                       <app:PartialListView   StartIndex="{Binding }"  
                                     IndexCount  = "{Binding IndexCount, ElementName = mycontrolname}"
                                     ItemsSource = "{Binding MenuItems , ElementName = mycontrolname}"
                       />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    
    
    

    切换“屏幕”将通过更改页面滚动器滚动查看器的水平偏移来完成

    你描述的行为看起来有点像包装纸。你能发布一个截图吗?HighCore,我刚刚添加了一个粗略的模型。Vincent,我不确定WrapPanel是否适合我,因为这些需要单独的行项目。我想我理解。例如,如果我使用网格,是否可以单独设置每行边距值的动画?我想滑入第一排,一旦开始滑入,滑入第二排,当第一排开始滑入,滑入第三排。。。在这种情况下,网格是否是确保ClipToBounds设置为false所需的父网格?谢谢是的,您可以在网格本身上将ClipToBounds设置为false。不过,使用网格可能很复杂,因为每个项目都可以有与其关联的行和列。如果使用垂直堆叠面板,然后每行添加一个水平堆叠面板,事情可能会更容易。在这种情况下,您可以将每个“行”的StackPanel添加到垂直StackPanel,然后将margin属性的动画从一个较大的负值设置为0。如果所有其他操作都失败,您可以退回到画布。我会尽量远离它。我已经为实际行创建了垂直StackPanel,其中包含水平StackPanel。唯一的问题是,我很难让列对齐,因为它不在网格中。第一列需要是可变长度(*),其中最后4列是固定的。这样就可以根据最终用户的屏幕分辨率/窗口大小进行缩放。你有什么想法吗?你可以用一个只有一行和你想要的列的网格来代替内部的水平堆叠面板。这样,您应该能够获得所需的列行为。:)确保内部栅格的宽度设置为相同的数量(您可能希望它们扩展到所有可用宽度)