2010-05-21 30 views
1

.net 3.5和.Net 4.0之间的行为似乎有所改变。文本框扩展到.Net 4.0中的网格单元之外(但不是3.5)

如果我定义了一个窗口:

<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

想了一下,我想我有一个可以接受的解决方法。我并不完全满意,如果有人有更好的(更清洁!)解决方案,那么我真的很想知道。

解决方法依赖于只要为该列(而不仅仅是MinWidth)设置了宽度属性就会显示正确的行为的事实。所以答案是始终将Width属性(通过绑定)设置为网格的正确百分比(基本上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列是什么个网格:

列MinWidth /电网的总宽度=百分比

最小宽度= 300 总宽= 478

478分之300= 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> 

我我会离开这个“没有回答”几天,看看有没有人能想出一个更清洁的解决方案(上面的解决方案真的是一个黑客!)。