Текстовое поле выходит за пределы ячейки сетки в .Net 4.0 (но не в 3.5) - PullRequest
1 голос
/ 22 мая 2010

Похоже, что в поведении между .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 голосов
/ 22 мая 2010

Подумав немного, думаю, у меня есть приемлемый обходной путь. Я не совсем доволен этим, и если у кого-то есть лучшее (более чистое!) Решение, я бы очень хотел знать.

Обходной путь основан на том факте, что правильное поведение отображается, пока для столбца установлено свойство Width (не только 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:

Мин. Ширина столбца / Общая ширина сетки = процент

Мин. Ширина = 300 Общая ширина = 478

300/478 = 62,7%

Затем измените Xaml, чтобы в столбце Width столбца 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>

Я собираюсь оставить это «без ответа» на несколько дней, чтобы посмотреть, сможет ли кто-нибудь придумать более чистое решение (решение, приведенное выше, действительно является взломом!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...