代码之家  ›  专栏  ›  技术社区  ›  Stephen Price

如何使来自自定义子项的列表框布局无效

  •  0
  • Stephen Price  · 技术社区  · 16 年前

    我有一个列表框的自定义面板

    <ItemsPanelTemplate x:Key="FloatPanelTemplate">
        <Controls:FloatPanel x:Name="CardPanel" />
    </ItemsPanelTemplate>
    

    该面板使用其X和Y依赖关系属性排列其子级。 当floatpanel被自己使用时,这一切都可以很好地工作-我正在使用frameworkpropertymetadaoptions.affectsarrange frameworkpropertymetadaoptions.affectsmeasure子项的依赖属性来告诉floatpanel重新绘制它的la尤特。

    当我在一个列表框(上面的代码)中使用它时,它第一次画得很好,但是当我拖动子项(修改项的x和y)时,它不会通知列表框它需要重新绘制floatpanel的子项。我认为这个问题与绑定集合中的每个项都用listboxitem包装有关。

    希望我已经描述了我做得足够好,有人可以告诉我如何使面板(或其子面板)告诉它需要再次执行布局例程。正如我所说,它只工作了一次(初始绘制),但拖动项目不起作用(listbox不知道其子项已更改,需要重新布局)。如果拖动项目,然后调整窗口大小,listbox将进行布局,并在新位置绘制项目。

    如何通知listbox(或者更重要的是itemspaneltemplate中的floatpanel)它需要进行布局传递?

    2 回复  |  直到 11 年前
        1
  •  1
  •   Josh    16 年前

    相反,请尝试FrameworkPropertyMetadataOptions.AffectSparentMeasure和FrameworkPropertyMetadataOptions.AffectSparentArrange。

    那些名字…感谢上帝的智慧,嗯?

    正如您所注意到的,由于listboxitem是元素的直接布局父级,因此影响父级布局的依赖项属性的更改将不会被位于可视化树上方的面板“看到”。

    因此,相反,您可能需要做的是遍历可视树,直到找到从panel派生的元素并调用其invalidaterange方法。

    DependencyObject obj=this;
    while ( (obj=VisualTreeHelper.GetParent(obj)) != null) {
        Panel p = obj as Panel;
        if (p != null) {
            p.InvalidateArrange();
            break;
        }
    }
    

    这很难看,但也许wpf专家会有更好的建议。

        2
  •  0
  •   Community Mohan Dere    9 年前

    你确定你的 ListBox ListView 面板显示的大小似乎不正确,因为它有…

    ScrollViewer.CanContentScroll="True"
    

    …哪个是默认值?

    当列表控件处于此模式时,当它滚动到底部时,在 底部 为了确保一个完整的项目在 顶部 它的内部 ScrollViewer ,这可能看起来像 滚动条 --因此,列表控件本身并没有调整大小。

    要防止面板底部出现空白,必须在列表框或列表视图控件上启用逐像素滚动:

    ScrollViewer.CanContentScroll="False"
    

    或在代码中:

    ScrollViewer.SetCanContentScroll(list_ctrl, false);
    

    参见: WPF ListView non integral scrolling

    推荐文章