绑定到 ColumnDefinition.ActualWidth 返回 0

发布于 2024-08-05 20:26:25 字数 539 浏览 2 评论 0原文

将其粘贴到苹果酒中。

<Grid x:Name="Grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="ColumnDefinition"/>
    </Grid.ColumnDefinitions>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="{Binding ActualWidth, ElementName=Grid}"/>
        <TextBlock Text="{Binding ActualWidth, ElementName=ColumnDefinition}"/>
    </StackPanel>
</Grid>

现在,运行它。第二个 TextBlock 显示 0,但不应该,对吧?解决方法?

Paste this into Cider.

<Grid x:Name="Grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="ColumnDefinition"/>
    </Grid.ColumnDefinitions>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="{Binding ActualWidth, ElementName=Grid}"/>
        <TextBlock Text="{Binding ActualWidth, ElementName=ColumnDefinition}"/>
    </StackPanel>
</Grid>

Now, run it. The second TextBlock shows 0, but shouldn't, right? Workaround?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

日记撕了你也走了 2024-08-12 20:26:25

不,你没有。实际上,ColumnDefinition 确实有一个 ActualWidth 属性。但它既不是 DependencyProperty 也不是 INotifyPropertyChanged 实现。因此,当 ActualWidth 更新时,没有人会让您的目标知道。

解决方法?为了什么?您始终可以使用 ElementName 绑定到父 FrameworkElement,它具有您想要的 ActualWidth。抱歉,短语很复杂:)。不能让它变得更简单。

希望这有帮助。

No, you didn't. ColumnDefinition does have an ActualWidth property, actually. But it's neither DependencyProperty nor there INotifyPropertyChanged implementation. So nobody let your target know when ActualWidth is updated.

Workaround? For what? You can always use ElementName binding to the parent FrameworkElement, who has exactly that ActualWidth that you wanted. Sorry for complex phrase :). Couldn't make it simpler.

Hope this helps.

零時差 2024-08-12 20:26:25

ColumnDefinition.ActualWidth 属性不是依赖属性,您的绑定只会显示它的初始值,在网格更新布局之前该值为 0。另一方面,Grid.ActualWidth 属性是一个依赖属性,绑定将随着宽度的变化而更新。

The ColumnDefinition.ActualWidth property is not a dependency property and you binding will only show it's initial value which is 0 before the grid has been updated for layout. The Grid.ActualWidth property on the other hand is a dependency property and the binding will get updated as the width changes.

笑脸一如从前 2024-08-12 20:26:25

来自 MSDN 页面

当您添加或删除行或列时,所有 ColumnDefinition 元素的 ActualWidth 和所有 RowDefinition 元素的 ActualHeight 都会变为零,直到调用 Measure。

不知何故,该值似乎在调用 Measure 之前就被绑定了。尝试在绑定上强制 Mode = OneWay,并手动检查代码,以确认此行为。

From the MSDN page:

When you add or remove rows or columns, the ActualWidth for all ColumnDefinition elements and the ActualHeight of all RowDefinition elements becomes zero until Measure is called.

It would seem that the value is being bound before Measure is being called, somehow. Try forcing Mode = OneWay on your binding, and checking manually in code as well, to confirm this behaviour.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文