2010-05-21 27 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> 

我我會離開這個「沒有回答」幾天,看看有沒有人能想出一個更清潔的解決方案(上面的解決方案真的是一個黑客!)。