【问题标题】:Why ActualSize is not updating its value on WPF?为什么 ActualSize 没有在 WPF 上更新其值?
【发布时间】:2012-01-25 18:57:14
【问题描述】:

我有以下代码:

<Window x:Class="UnderstandSizing.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window2" Height="300" Width="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" x:Name="Column1" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=Column1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>

我希望在文本框中看到 Column1 列的宽度值,但我只能看到 0。

我见过thisthis,但到处都说这仅与 Silverlight 有关,与 WPF 无关。

编辑 修正了一个错字。还要注意输出窗口不显示任何绑定问题。对我来说奇怪的是它在设计师中工作。它仅在运行时停止工作。

【问题讨论】:

  • 你有一个错字。 “ElementName=Colum1”应该是“ElementName=Column1”
  • @theartwebreathe:不,在将代码放在 SO 时输入了错字:(

标签: .net wpf binding


【解决方案1】:

有趣...

正如 DanM 所发现的,ColumnDefinition.ActualWidth 不是依赖属性,因此当它更改时您不会获得绑定更新。

一种解决方法是在列中放置一个隐藏控件并像这样绑定到它的 ActualWidth:

    <ContentControl Visibility="Hidden" Grid.Column="0" HorizontalAlignment="Stretch" x:Name="hidden"/>
    <TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=hidden,Mode=OneWay}" />

【讨论】:

  • 很奇怪,但它的开始是......所以坏的东西是 Grid 列?
  • 对。它正在工作,但如果可能的话,我更喜欢其他解决方案,如果没有,我会将您的回答标记为正确答案。
【解决方案2】:

这不是循环引用吗? “Column1”的宽度取决于您的TextBoxText,而您的TextBoxText 取决于“Column1”的宽度。除非您明确设置“Column1”或TextBox 的宽度,否则我看不出 WPF 如何解决此值。

编辑

哦,我看到了问题。 ActualWidthdouble 不是依赖属性,因此在计算值时您将永远不会收到更新。

您需要使用@Robert Levy 的建议,即在您的TextBox 占用的空间中放置一个虚拟控件,然后绑定到其中的ActualWidth

【讨论】:

  • 如果是这种情况,我会期待一个永无止境的循环而不是 0。无论如何,文本 100 需要与 110 相同的空间。
  • 零可能是WPF处理死循环的方式。
  • 我尝试更改为 rowheight 并且发生了同样的情况,所以看起来这不是正在发生的事情,因为该行具有相同的高度,有或没有文本。
  • 抱歉,MSDN 说那是 DP。 msdn.microsoft.com/en-us/library/…
  • @SoMoS,ColumnnDefinition 不是FrameworkElementmsdn.microsoft.com/en-us/library/…。它实际上是一个FrameworkContentElement,这不是一回事。这是实际属性的页面——它清楚地写着double for ActualWidthmsdn.microsoft.com/en-us/library/…
【解决方案3】:

您在这行 XAML 中有错字:

<TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=Colum1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />

ElementName 应该是 Column1 而不是 Colum1。

XAML 的优点之一是,如果您进行了不正确的绑定,它仍然可以运行,而 XAML 令人沮丧的事情之一是,如果您进行了不正确的绑定,它仍然可以运行。

编辑

如果你绑定到文本框本身的 ActualWidth,也就是在列内,它会正常工作。

<TextBox Name="tbk1" Grid.Column="0" Text="{Binding ElementName=tbk1, Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />

或者,更简单(不需要命名文本框):

<TextBox Grid.Column="0" Text="{Binding Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource Self}}" />

【讨论】:

  • 不,错字是在 SO 输入代码 :( 你能在你的机器上试试这个代码吗?
  • 代码在我的机器上完美运行,错字已修复。显示实际的列宽,即使在设计时也是如此。
  • 仅在设计时,请在运行时尝试。我有两台机器,一台是 2008 的,另一台是 2010 的,都重现了这个问题 ¿?
  • 看起来不错的解决方案,类似于罗伯特所说的。你怎么知道它是循环引用?
猜你喜欢
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多