c# - 如何绑定(bind)到控件的文字实际宽度(包括其边距)?

标签 c# wpf xaml layout data-binding

根据 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 不是实际 宽度,而是没有边距的宽度。

  1. 我在这里是不是混淆了什么?如果是,是什么?
  2. 如何获取并绑定(bind)到实际实际呈现的宽度?

enter image description here

最佳答案

链接的答案是:

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/

相关文章:

c# - 在 VB.NET 2005 或 C#.NET 2005 中使用多个数据读取器,并以 MySQL 5.0 作为后端

c# - APNS APPLE C# sslstream 响应

c# - Azure移动应用程序自定义json序列化

wpf - XAML:如何将 GroupBox Header 的一部分设为粗体?

c# - WPF - FrameworkElement - 枚举所有后代?

c# - DispatcherTimer 使用 MVVM 更新 TextBlock

c# - WebAPI OData 无法加载 microsoft.data.odata 版本=5.6.0.0

c# - 使用 Tabcontrol WPF 时无法选择列表框中的项目

wpf - 如何设置下一个要写入的文本的RichTextBox字体?

c# - TreeViewItem 中的背景不是全宽