文本框扩展到.Net 4.0中的网格单元格之外(但不在3.5中)

时间:2010-05-21 22:24:09

标签: wpf textbox

.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相同的行为?

1 个答案:

答案 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>

我会留下这个“没有答案”几天,看看是否有人能想出一个更清洁的解决方案(上面的解决方案确实是一个黑客!)。