我正在xaml(WPF)中构建一个用户界面,我有一个带有自动生成列的datagrid
,用于填充其容器(dockpanel
),但也有冻结列。
根据窗口的大小和网格中的数据量,右侧的无冻结列会自动获得水平滚动条。
我感兴趣的是,当scrollviewer
变得大于datagrid
时,可以在datagrid
内检索dockpanel
的宽度,可能在xaml中直接将它绑定到另一个元素,或者如果第一个选项不可能则在后面的代码中。我还想检索scrollviewer
内的内容宽度。
我想到了获得周围元素的实际宽度并做了一些计算,但这听起来很乏味......
有人有建议吗?
由于
答案 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>
这主要回答了我的问题,但如果有人有更好的选择,我会很高兴看到它。