.Net 3.5和.Net 4.0之间的行为似乎发生了变化。
如果我将窗口定义为:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="500" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="300" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="1" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" Text="abc abc abc abc abc abc abc abc abcabc abc abcabc abc abc abc abc abc" />
</Grid>
</Window>
在.Net 3.5中,文本框正确地包含在网格单元格内,但在.Net 4.0中,它扩展到单元格之外,因此被剪切。仅当第一列的MinWidth大于总宽度的50%时才会发生这种情况。
有谁知道如何让4.0显示与3.5相同的行为?
答案 0 :(得分:0)
在考虑了一下后,我想我有一个可接受的解决方法。我对此并不十分满意,如果有人有更好的(更干净!)解决方案,那么我真的很想知道。
解决方法依赖于以下事实:只要为列设置了Width属性(而不仅仅是MinWidth),就会显示正确的行为。所以答案是始终将Width属性(通过绑定)设置为Grid的正确百分比(基本上WPF应该为我做什么)。
要做到这一点,首先要创建一个可以进行乘法运算的转换器:
public class MultiplicationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return double.NaN;
return (double)value * double.Parse((string)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后计算MinWidth列的网格百分比:
列的最小宽度/网格的总宽度=百分比
最小宽度= 300 总宽度= 478
300/478 = 62.7%
然后更改Xaml以将MinWidth列的宽度设置为网格的百分比(请注意,转换器的命名空间将更改为您将其放入的命名空间):
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="500" >
<Window.Resources>
<local:MultiplicationConverter x:Key="MultiplicationConverter" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="300" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Converter={StaticResource MultiplicationConverter}, ConverterParameter=0.627}" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="1" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" Text="abc abc abc abc abc abc abc abc abcabc abc abcabc abc abc abc abc abc" />
</Grid>
</Window>
我会留下这个“没有答案”几天,看看是否有人能想出一个更清洁的解决方案(上面的解决方案确实是一个黑客!)。