设置边距,在控件上绑定到ActualWidth的宽度会导致VS2012崩溃

时间:2013-08-14 04:28:28

标签: .net wpf xaml user-controls actualwidth

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

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

<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耗尽内存。

enter image description here

知道可能导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

引自StackPanel MSDN

  

StackPanel中包含的内容的Horizo​​ntalAlignment和VerticalAlignment的默认值为stretch。

由于面板的默认对齐NaN,该面板设置WidthHeight都是从父级StackPanel继承而来的没有明确的参数。在此面板中,宽度和高度继承自Window

答案 1 :(得分:0)

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

我怀疑正在发生的是边距与宽度规范冲突并导致在渲染设计时抛出某种异常。由于库中存在实际的代码错误,我在一段时间内遇到了一些DevExpress网格控件的类似问题,但结果与您所描述的非常相似。

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

http://wpftutorial.net/LayoutProperties.html