在xaml中获取数据网格内的scrollviewer的宽度

时间:2016-08-09 16:13:58

标签: c# wpf xaml datagrid

我正在xaml(WPF)中构建一个用户界面,我有一个带有自动生成列的datagrid,用于填充其容器(dockpanel),但也有冻结列。

根据窗口的大小和网格中的数据量,右侧的无冻结列会自动获得水平滚动条。

我感兴趣的是,当scrollviewer变得大于datagrid时,可以在datagrid内检索dockpanel的宽度,可能在xaml中直接将它绑定到另一个元素,或者如果第一个选项不可能则在后面的代码中。我还想检索scrollviewer内的内容宽度。

我想到了获得周围元素的实际宽度并做了一些计算,但这听起来很乏味......

有人有建议吗?

由于

1 个答案:

答案 0 :(得分:0)

借助此帖"access-scrollview-properties-of-a-datagrid-in-wpf",我设法通过可视树访问scrollviewer的{​​{1}}。

然而,尽管检查了datagrid的几个属性,但我无法找到我要找的东西。

所以,我最终自己计算了大小(scrollviewer的宽度 - 冻结列的宽度)。我想我还会计算其他列的宽度,以获得datagrid内的内容宽度...

这是一个在Blend中运行的简单示例(项目名称: GridScrollViewer ):

MainWindow.xaml:

scrollviewer

MainWindow.xaml.cs:

<Window x:Class="GridScrollViewer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:GridScrollViewer"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<DockPanel
    LastChildFill="True"
    Margin="10">

    <StackPanel
        Width="auto"
        Orientation="Horizontal"
        DockPanel.Dock="Bottom">
        <TextBlock Text="Scrollviewer offset: "/>
        <TextBlock Name="myScrollViewerOffsetText"  Text=""/>
    </StackPanel>

    <StackPanel
        Width="auto"
        Orientation="Horizontal"
        DockPanel.Dock="Bottom">
        <TextBlock Text="Scrollviewer width?: "/>
        <TextBlock Name="myScrollViewerText"  Text=""/>
    </StackPanel>

    <StackPanel
        Width="auto"
        Orientation="Horizontal"
        DockPanel.Dock="Bottom">
        <TextBlock Text="Expected value for scrollviewer width: "/>
        <TextBlock Name="myExpectedValueText"  Text=""/>
    </StackPanel>

    <StackPanel
        Width="auto"
        Orientation="Horizontal"
        DockPanel.Dock="Bottom">
        <TextBlock Text="First four columns width: "/>
        <TextBlock Name="myColumnsText" Text=""/>
    </StackPanel>

    <StackPanel
        Width="auto"
        Orientation="Horizontal"
        DockPanel.Dock="Bottom">
        <TextBlock Text="Datagrid width: "/>
        <TextBlock Text="{Binding ElementName=myGrid, Path=ActualWidth}"/>
    </StackPanel>

    <DataGrid
        ItemsSource="{Binding}"
        Name="myGrid"
        DockPanel.Dock="Top"
        Margin="0,0,0,10"
        FrozenColumnCount="4"
        HorizontalScrollBarVisibility="Visible"
        HeadersVisibility="Column"
        CanUserAddRows="False"
        CanUserDeleteRows="False"
        CanUserResizeColumns="True"
        LayoutUpdated="myGrid_LayoutUpdated"
        />

</DockPanel>

这主要回答了我的问题,但如果有人有更好的选择,我会很高兴看到它。