我的google和stackoverflow search-fu让我失望了,所以我向社区提出了这个问题.
(这是使用VS2010和.NET 4.0生成的,在一个空白的默认WPF解决方案中)
考虑以下XAML:
<StackPanel Orientation="Horizontal">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2"
Background="Red" Width="200"/>
<Border Name="aborder2" Background="Green"/>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
你会预测"aborder2"的宽度是多少?
如果你猜到"20像素",你就错了.正确的答案是110像素.
考虑一下这个XAML:
<StackPanel Orientation="Horizontal">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2"
Background="Red" Width="200"/>
<Border Name="aborder2" Background="Green"/>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
你会预测"aborder2"的宽度是多少?
如果你猜到20像素或110像素,你就错了.正确答案是200像素.
我无法弄明白这一点,这让我感到疯狂.似乎答案应该是显而易见的; 显然,自动填充网格列和堆栈面板之间存在一些相互作用,导致网格发生故障.但它似乎没有意义 - 无论规则如何,这种行为似乎都是武断的.为何110像素?为什么不是109像素或100像素?我会理解,如果自动调整大小的列无法完全展开或者某些东西,但是为了让固定宽度列随机忽略它的宽度,我会给开发人员留下一个烧焦的外壳.
任何帮助或指导灯将非常感谢!
Visual Studio 2010 | .NET/WPF 4.0
我认为这可能是一个WPF错误,但我似乎无法找到有关它的错误报告.为了掩盖我只是遗漏一些明显的东西的可能性,我转向stackoverflow寻求答案!
考虑一下这个xaml(代码隐藏中没有任何东西):
<Window x:Class="DownExpanders.BorderTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BorderTest" Height="300" Width="300">
<Window.Resources>
<Color x:Key="BackgroundColor" R="255" G="0" B="0" A="255"/>
<Color x:Key="BorderColor" R="0" G="0" B="255" A="255"/>
<SolidColorBrush x:Key="BorderColorBrush" Color="{DynamicResource BorderColor}"/>
</Window.Resources>
<Grid>
<Border BorderThickness="20">
<Border.Background>
<SolidColorBrush Color="{DynamicResource BackgroundColor}"/>
</Border.Background>
<Border.BorderBrush>
<SolidColorBrush Color="{DynamicResource BorderColor}"/>
</Border.BorderBrush>
</Border>
<Border Margin="40" BorderBrush="{DynamicResource BorderColorBrush}" BorderThickness="20"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
在设计师中,它按预期呈现.外边框有一个大的蓝色边框和一个红色背景,内边框有一个大的蓝色边框.大.
当我运行代码时,外边框没有边框 - 看起来它只是没有加载.背景设置为红色正确.同时,内边框确实正确加载其蓝色边框.
如果我将所有"DynamicResource"更改为"StaticResource",它会在运行时正确呈现.这种不一致真的让我烦恼,我无法弄明白.
所以:
编辑:
看起来它是MS决定不修复(感谢一个bug 谢里登的链接):http://connect.microsoft.com/VisualStudio/feedback/details/589898/wpf-border-borderbrush-does-not-see-变化,在动态资源