【问题标题】:How do I retrieve column width in a WPF Grid using a GridSplitter?如何使用 GridSplitter 在 WPF 网格中检索列宽?
【发布时间】:2011-12-13 20:39:54
【问题描述】:

我需要向用户显示两个列表框 - 一个在窗口的两侧 - 并允许用户选择为每个列表框分配多少屏幕空间。我通过以下代码实现了这么多:

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding FirstColumnWidth}" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ListBox Name="FirstColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="0" />
    <GridSplitter Name="gridSplitter1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="1" />
    <ListBox Name="SecondColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="2" />
</Grid>

但是,虽然绑定将检索第一列的初始宽度并相应地调整它们的大小,但使用 GridSplitter 调整它们的大小只是将绑定替换为新值。如何检索新值以便将其持久化?

理想情况下,该解决方案需要与 MVVM 很好地配合使用 - 我正在使用 Caliburn 并尝试保持代码尽可能干净(我的视图模型包含当前正在绑定的 FirstColumnWidth 属性)。

【问题讨论】:

  • 宽度仅在开始时设置。 ActualWidth 是实际宽度的属性。您可能可以将 ActualWidth 绑定为只写属性(模式)。但我记得有一个帖子,尽管它非常有道理。
  • 您需要查看 ActualWidth 属性。检查此以获取有关如何从视图模型访问它的更多信息:stackoverflow.com/questions/4438412/…

标签: wpf caliburn.micro gridsplitter


【解决方案1】:

我能想到两种解决方案。

1. 使用可用的不同binding modes 以及WidthActualWidth 属性。

示例

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Path=FirstColumnWidth, Mode=OneTime}" />
        <ColumnDefinition Width="3" />
        <ColumnDefinition Width="{Binding Path=SecondColumnWidth, Mode=OneTime}" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Column="0" ActualWidth="{Binding Path=FirstColumnWidth, Mode=OneWayToSource}">
        <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
    <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    <Grid Grid.Column="2" ActualWidth="{Binding Path=SecondColumnWidth, Mode=OneWayToSource}">
        <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Grid>

2. 使用附加的行为模式 (tutorial on CodeProject) 覆盖网格拆分器的当前/默认行为。明天当我在办公桌前时,我将发布此代码示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2017-02-22
    • 2020-06-25
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多