不裁剪项目的虚拟化面板

2023-12-12

因此,如果项目在滚动区域的末尾被剪切/裁剪,那么拥有无镶边的集合看起来真的很愚蠢。

我想为集合(ItemsControl/ListBox)创建一个虚拟化面板,它只绘制整个项目,而不是项目的各个部分。例如:

 ______________
|              |
|______________|
 ______________
|              |
|______________|
 ______________
|              |

enter image description here

我不希望显示第三个部分容器,除非有空间显示整个项目/容器。在示例中,由于空间不足,第三个项目被裁剪。

有什么建议么?我应该尝试重新发明轮子(构建我自己的VirtualizingWholeItemPanel)?

EDIT:

微软澄清说VirtualizingPanel.ScrollUnit根本不打算执行此功能。看起来VirtualizingPanel.ScrollUnit与旧的目的非常相似CanContentScroll on ScrollViewer.


我有一个辅助方法,用于确定控件在父容器中是否部分或完全可见。你也许可以将它与Converter以确定项目的可见性。

您的转换器需要从 UI 项目计算父容器(我的博客有一组视觉树助手如果你愿意的话,这可以帮助你),或者它可以是MultiConverter它接受 UI 项和父容器作为参数。

ControlVisibility ctrlVisibility= 
    WPFHelpers.IsObjectVisibleInContainer(childControl, parentContainer);

if (ctrlVisibility == ControlVisibility.Full 
    || isVisible == ControlVisibility.FullHeightPartialWidth)
{
    return Visibility.Visible;
}
else
{
    return = Visibility.Hidden;
}

确定控件在其父级中的可见性的代码如下所示:

public enum ControlVisibility
{
    Hidden,
    Partial,
    Full,
    FullHeightPartialWidth,
    FullWidthPartialHeight
}


/// <summary>
/// Checks to see if an object is rendered visible within a parent container
/// </summary>
/// <param name="child">UI element of child object</param>
/// <param name="parent">UI Element of parent object</param>
/// <returns>ControlVisibility Enum</returns>
public static ControlVisibility IsObjectVisibleInContainer(
    FrameworkElement child, UIElement parent)
{
    GeneralTransform childTransform = child.TransformToAncestor(parent);
    Rect childSize = childTransform.TransformBounds(
        new Rect(new Point(0, 0), new Point(child.ActualWidth, child.ActualHeight)));

    Rect result = Rect.Intersect(
        new Rect(new Point(0, 0), parent.RenderSize), childSize);

    if (result == Rect.Empty)
    {
        return ControlVisibility.Hidden;
    }
    if (Math.Round(result.Height, 2) == childSize.Height 
        && Math.Round(result.Width, 2) == childSize.Width)
    {
        return ControlVisibility.Full;
    }
    if (result.Height == childSize.Height)
    {
        return ControlVisibility.FullHeightPartialWidth;
    }
    if (result.Width == childSize.Width)
    {
        return ControlVisibility.FullWidthPartialHeight;
    }
    return ControlVisibility.Partial;
}

Edit

做了一些测试,显然转换器在控件实际渲染之前就已经运行了。作为一个黑客,如果你使用MultiConverter并传递给ActualHeight控件的,这将迫使转换器在渲染控件时重新评估。

这是我使用的转换器:

public class TestConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        FrameworkElement child = values[0] as FrameworkElement;
        var parent = VisualTreeHelpers.FindAncestor<ListBox>(child);

        ControlVisibility ctrlVisibility =
            VisualTreeHelpers.IsObjectVisibleInContainer(child, parent);

        if (ctrlVisibility == ControlVisibility.Full
            || ctrlVisibility == ControlVisibility.FullHeightPartialWidth)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Hidden;
        }
    }

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

我使用了您在问题中发布的 XAML,并且只是添加了隐式样式ListBoxItem in the .Resources

<ListBox.Resources>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="Visibility">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource Converter}">
                    <Binding RelativeSource="{RelativeSource Self}" />
                    <Binding RelativeSource="{RelativeSource Self}" Path="ActualHeight" />
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</ListBox.Resources>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不裁剪项目的虚拟化面板 的相关文章

随机推荐

  • 如何使用 Spring Kafka 检查 Kafka 是否为空?

    当我重新启动应用程序时 我需要处理 Kafka 中的剩余消息 直到它为空 然后我的应用程序应该继续正常工作 我的问题是如何检查 Kafka 主题是否为空 我正在使用 Spring Kafka Set the idleEventInterva
  • 在 Angular JS 中渲染 404 页面而不重定向

    我正在将 ui router 和 ngResource 与 AngularJS 一起使用 我的问题是 如何渲染 404 而不重定向到它 例如用户键入http www example com 错误页面名称 他应该只看到 404 页面 并且 U
  • 正确使用 sizeof 和 Byte[]

    我有点不知所措 但我有以下代码 真正的代码当然有道理 NSData dataTheseBytes Byte bytes return NSData dataWithBytes bytes length sizeof bytes 编译器警告是
  • 如何从 cin 获取超过 1 个单词的输入 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我目前正在尝试学习 C 并且正在开发我的第一个项目 它应该提出问题并让用户提供答案的输入 然后将输入写入具有某种格式的文件中 但是 我在描述行输入中不断收到错误 它只接受句子中的第一个单词
  • Android 列表视图 setOnItemClickListener 不起作用

    我想最初在列表视图中隐藏编辑文本和按钮字段 并在单击该原始数据时显示列表视图中特定原始数据的编辑文本和按钮 因此 我尝试在布局 xml 中将高度设置为 0 然后设置它当用户单击原始值时 它会变为其他值 但它不起作用我认为我的列表视图单击事件
  • `for..of` 循环如何从对象解析迭代器?

    对于实现可迭代接口的对象 它必须实现 Symbol iterator 指向一个函数的键 该函数返回iterator 我想知道是否for of循环在对象内部调用此方法来获取iterator 我很好奇的原因是 例如 Map定义了一个带有多个迭代
  • 在 JPasswordField 中显示密码,而不是将 0 设置为回显字符

    如何显示 JPasswordField 的文本而不是将 0 设置为回显字符 Java 文档说 设置值 0 表示您希望查看键入的文本 类似于标准 JTextField 的行为 以下结果导致不兼容类型错误 outField setEchoCha
  • WPF SplashScreen,如何使闪屏显示时间更长

    我发现只有一种方法可以延长启动显示时间 现在是将 ApplicationDefinition 更改为 Page 并进行配置 但我需要应用程序定义 我在这里找到了定位器 如果我使用页面 它就会丢失 所以我想让启动屏幕显示时间和显示主窗体之前的
  • MySQL ORDER BY RAND() 函数何时排序?

    我读过有关 ORDER BY RAND 及其性能问题的内容 这些是否仅适用于返回大型数据集的查询 例如 如果我有一个包含 100 000 行的表 并使用 WHERE 子句返回包含 10 条记录的数据集 然后使用 ORDER BY RAND
  • 使用命名范围填充列表框

    我正在开发我的第一个 VBA 项目 需要一些绝对的新手指导 我有一份提交表格 员工将用它来提交他们的每日 KPI 我在用户表单中有一个名为 lstName 的列表框控件 员工在提交表单之前将使用该控件来选择自己的姓名 员工姓名存储在 She
  • 在 Windows XP 上安装 wxPython 后“导入 wx”失败

    我下载并安装了这个版本wxPython与我的 Python 2 6 安装一起使用 http downloads sourceforge net wxpython wxPython2 8 win32 unicode 2 8 9 1 py26
  • 单击并拖动 Selenium(chrome webdriver)不是拖动,而是单击并按住

    因此 我尝试自动化一个可以单击的列表元素 并将其拖动到 ol 元素的不同部分 然后保存 但测试只会持续到保持该元素为止 它不会移动偏移量 也不会移动到目标元素 Chrome 网络驱动程序 Java Selenium public void
  • 是否可以将 Azure VM 从托管磁盘转换为非托管磁盘? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 如果您认为该问题与主题相关另一个 Stack Exchange 站点 您可以发表评论来解释问题可以在哪里得到解
  • 关联 php 数组中的下一个元素

    这看起来很容易 但我不明白 users emails array Spence gt email protected Matt gt email protected Marc gt email protected Adam gt email
  • 在jasper报告中命名excel中动态生成的工作表名称

    我有一个要求 我需要生成 Excel 格式的报告 Excel工作表的工作表将动态生成 我想知道是否有一种方法可以命名这些动态生成的工作表 使用 net sf jasperreports export xls sheet names ator
  • 同一台计算机上的两个 Chrome 会话 - 一个将连接到我们的 Azure 网站,另一个“无法连接到 SQL Server 数据库”

    我们遇到一个 Azure 网站的问题 该网站间歇性失败并出现以下错误 SqlException 0x80131904 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误 服务器未找到或无法访问 验证实例名称是否正确以及
  • PHP中使用IMAP()获取最近未读邮件数

    我正在努力得到不 来自 gmail 帐户的最近未读邮件 为此 我在 Ubuntu 系统中安装了 IMAP 并尝试了一些 PHP iMAP 功能 这是我到目前为止所尝试过的 connect to gmail hostname imap gma
  • C# 删除空url参数正则表达式

    我正在尝试使用 C 从字符串中删除空 url 类型参数 我的代码示例在这里 public static string test string parameters one aa two three aaa four string patte
  • 如何获取带有波纹可绘制的按钮的颜色

    我有各种按钮 我想获取它们的背景颜色 在颜色可绘制中获取背景颜色很容易 但在波纹可绘制中并不容易 我如何设法从波纹可绘制中获取背景颜色 尝试这个 RippleDrawable rippleDrawable RippleDrawable bu
  • 不裁剪项目的虚拟化面板

    因此 如果项目在滚动区域的末尾被剪切 裁剪 那么拥有无镶边的集合看起来真的很愚蠢 我想为集合 ItemsControl ListBox 创建一个虚拟化面板 它只绘制整个项目 而不是项目的各个部分 例如 我不希望显示第三个部分容器 除非有空间