C# 如何在没有滚动条的情况下获取ListView的实际宽度

C# 如何在没有滚动条的情况下获取ListView的实际宽度,c#,xaml,windows-runtime,windows-store-apps,winrt-xaml,C#,Xaml,Windows Runtime,Windows Store Apps,Winrt Xaml,我有一个用于ListView项目的DataTemplate。在这个数据模板中,我有一个网格控件,我需要该控件的列表视图的实际宽度,但没有滚动条的宽度,因为这样一些内容就会隐藏在滚动条后面。我无法使用ListViewItems的宽度,因为我正在使用此模板定义它。我在这里看到了一些关于WPF和祖先的答案,但我认为这在WinRT中是不可能的 编辑: 我已尝试获取listview的scrollviewer视口宽度。这是我得到的密码 <DataTemplate x:Key="ListViewTemp

我有一个用于
ListView
项目的
DataTemplate
。在这个
数据模板
中,我有一个
网格
控件,我需要该控件的
列表视图的实际宽度
,但没有滚动条的宽度,因为这样一些内容就会隐藏在滚动条后面。我无法使用
ListViewItem
s的宽度,因为我正在使用此模板定义它。我在这里看到了一些关于WPF和祖先的答案,但我认为这在WinRT中是不可能的

编辑: 我已尝试获取listview的scrollviewer视口宽度。这是我得到的密码

<DataTemplate x:Key="ListViewTemplate">
      <Grid Width="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ContainerViewportWidthConverter}}">
            <Grid.RowDefinitions>...

...
这是我的listview正在使用的数据模板,它位于一个单独的xaml文件中

转换器如下所示:

        if (!(value is FrameworkElement)) return null;
        var ctrl = value as FrameworkElement;
        var scrollViewer = ctrl.GetFirstAncestorOfType<ScrollViewer>();
        return scrollViewer.ViewportWidth;
if(!(值为FrameworkElement))返回null;
var ctrl=作为框架元素的值;
var scrollViewer=ctrl.GetFirstAncestorOfType();
返回scrollViewer.ViewportWidth;
scrollViewer始终变为
null
,应用程序崩溃
当我尝试获取所有祖先或后代时,返回列表也是空的。

您是否尝试过
ScrollViewer.ViewportWidth

您是否尝试过
ScrollViewer.ViewportWidth

我尝试过,但我是初学者,所以我不知道如何获取listviews ScrollViewer的引用,我也不知道如何在XAML中绑定它。简单的答案是使用WinRT XAML工具包,但您可以使用
VisualTreeHelper
从控件模板找到
ScrollViewer
。例如,我已经尝试过你的方法,但我无法使它起作用。我把我的问题编辑得更具体一些。如果转换器不是一个好主意,也许您可以给我一些建议,将此代码放在何处。我认为将VisualTreeHelper调用放在DataTemplate的转换器中不起作用,因为绑定可能是在将项添加到可视化树之前首先计算的。您可能需要处理ListView的SizeChanged事件,并在此时检查维度。此时,您可以更新视图模型中的属性,并使DataTemplate将其宽度绑定到该属性。如果经常发生大小更改事件,您可能需要对其进行时间限制。也就是说,你的ListView有没有调整过大小?通常不会,恒定宽度有效。谢谢。我已经创建了一个要绑定到的属性,并在代码中进行了设置。我尝试过,但我是一个初学者,所以我不知道如何获取listviews ScrollViewer的引用,也不知道如何在XAML中绑定它。简单的答案是使用WinRT XAML Toolkit,但是您可以使用
VisualTreeHelper
从控件模板找到更多方法来查找
ScrollViewer
。例如,我已经尝试过你的方法,但我无法使它起作用。我把我的问题编辑得更具体一些。如果转换器不是一个好主意,也许您可以给我一些建议,将此代码放在何处。我认为将VisualTreeHelper调用放在DataTemplate的转换器中不起作用,因为绑定可能是在将项添加到可视化树之前首先计算的。您可能需要处理ListView的SizeChanged事件,并在此时检查维度。此时,您可以更新视图模型中的属性,并使DataTemplate将其宽度绑定到该属性。如果经常发生大小更改事件,您可能需要对其进行时间限制。也就是说,你的ListView有没有调整过大小?通常不会,恒定宽度有效。谢谢。我已经创建了一个要绑定到的属性,并在代码隐藏中设置了它。