4

我在搞乱DataGrid标题,发现了一些尴尬的事情。我一直在玩弄它,直到在 XAML 中找到根本原因并构建了一个如何重现的小样本。

我只使用文本框和数据网格对此进行了测试,但我怀疑它也适用于其他控件。当数据网格或文本框的宽度绑定到同级元素时,在数据网格或文本框上设置Margin属性(我设置)将导致我的整个 Visual Studio 几乎立即停止响应。 Margin="2"ActualWidth

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" SizeToContent="WidthAndHeight">

        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal" x:Name="panel">
                <TextBlock Text="Text:1" Width="90" />
                <TextBox Width="90" />
            </StackPanel>
            <DataGrid AutoGenerateColumns="False" Width="{Binding ActualWidth, ElementName=panel}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Test" Width="*" />
                    <DataGridTextColumn Header="Test2" Width="*" />
                    <DataGridTextColumn Header="Test3" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
            <TextBox Width="{Binding ActualWidth, ElementName=panel}"  />
        </StackPanel>
</Window>

这是设计预览在停止响应之前的样子。窗口延伸到“无穷大”,直到我怀疑 VS 内存不足。

在此处输入图像描述

知道是什么原因造成的吗?

4

2 回答 2

1

尝试设置HorizontalAlignment="Left"(无论哪种对齐方式)StackPanel

<StackPanel x:Name="panel" Orientation="Horizontal" HorizontalAlignment="Left">
    <TextBlock Text="Text:1" Width="90" />
    <TextBox Width="90" />
</StackPanel>

在面板宽度将为180,以及所有其余控件,此值将继承自绑定 ( DataGrid, TextBox)。

来自StackPanel MSDN的报价:

StackPanel 中包含的内容的 Horizo​​ntalAlignment 和 VerticalAlignment 的默认值是拉伸。

由于panel的默认对齐方式NaN,该面板设置和继承自 parent - ,也没有显式参数。在这个面板中,宽度和高度继承自.WidthHeightStackPanelWindow

于 2013-08-14T05:05:03.197 回答
0

在 WPF 中,不应同时指定宽度和边距。两者都可用于设置项目的大小。边距相对于它们的对齐位置。

我怀疑正在发生的事情是边距与宽度规范冲突,并导致在呈现设计时引发某种异常。由于库中的实际代码错误,我不久前遇到了一些 DevExpress 网格控件的类似问题,但结果与您描述的非常相似。

我建议将您的代码转换为仅使用边距和对齐方式。有关更多信息,请参阅此链接:

http://wpftutorial.net/LayoutProperties.html

于 2013-08-14T04:56:50.710 回答