根据 some folks ,实际宽度 是使用 ActualWidth 属性获得的,如下例所示。这是有道理的,但我似乎遇到了矛盾的行为。
<Canvas Width="{Binding ActualWidth,ElementName=Expy}">
<Expander x:Name="Expy"
HorizontalAlignment="Left"
Margin="0,0,0,0"
VerticalAlignment="Top" ...>
...
</Expander>
</Canvas>
在上面的设置中,行为与预期一致,尽管紧紧挤压在一起,但包含 Canvas 的面板中的下一个元素没有与其前一个元素重叠。
但是,如果我将边距更改得更宽一些,我可以清楚地看到 Canvas 侵入了下一个元素,估计与我在边距属性中请求的小 Sprite 数量相同。所以看起来 ActualWidth 不是实际 宽度,而是没有边距的宽度。
- 我在这里是不是混淆了什么?如果是,是什么?
- 如何获取并绑定(bind)到实际实际呈现的宽度?
最佳答案
链接的答案是:
ActualWidth accounts for padding and margins ...
这是不正确的。 ActualWidth
包括仅 内边距,不包括边距(与 ActualHeight
相同)。
其他人对该答案留下的评论提供了适当的更正。
此 XAML 代码说明了这个问题:
<Window x:Class="..."
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBlock x:Name="First" Text="Some text" Padding="10" Margin="0,0"
HorizontalAlignment="Left" Background="Yellow" />
<TextBlock Text="{Binding ActualWidth, ElementName=First}" />
<TextBlock x:Name="Second" Text="Some text" Padding="10" Margin="10,0"
HorizontalAlignment="Left" Background="LimeGreen" />
<TextBlock Text="{Binding ActualWidth, ElementName=Second}" />
</StackPanel>
</Window>
如果运行此程序,您将看到两个“Some text”文本 block 具有相同的 ActualWidth
值,尽管第二个文本 block 应用了水平边距。
您询问了如何考虑到这一点。无法通过绑定(bind)来完成此操作,因为 ActualWidth
属性不包括已声明的边距。您可以做的是将边距应用到父元素( Canvas ),而不是应用到扩展器。
换句话说,不是这样做:
<Canvas Width="{Binding ActualWidth,ElementName=Expy}">
<Expander x:Name="Expy" ... Margin="10" ... >
...
</Expander>
</Canvas>
这样做:
<Canvas Width="{Binding ActualWidth,ElementName=Expy}" Margin="10">
<Expander x:Name="Expy" ... >
...
</Expander>
</Canvas>
关于c# - 如何绑定(bind)到控件的文字实际宽度(包括其边距)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28362036/