2015-02-11 2 views
1

Если приложение wpf установило UseLayoutRounding в true для окна, то gridsplitter больше не будет работать для некоторых оконных ширин (он будет застревать в исходном положении), например, пример ниже.WPF Gridsplitter не работает с UseLayoutRounding

<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="200" Width="401" 
     UseLayoutRounding="True"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <TextBlock Grid.Column="0"> 
      long string that does not fit within the textblock - long string that does not fit within the textblock 
     </TextBlock> 

     <GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="50" Background="LightBlue" /> 

     <TextBlock Grid.Column="2"> 
      long string that does not fit within the textblock - long string that does not fit within the textblock 
     </TextBlock> 
    </Grid> 
</Window> 

Обратите внимание, что для примера, чтобы генерировать ошибку окна Ширина должна быть 401, текст в текстовых полях должно быть длиннее, чем текстовое поле и UseLayoutRounding должно быть истинным.

Любой, кто знает, как избежать этого или иметь обходное решение? Я не хочу устанавливать UseLayoutRounding в false, поскольку он вызывает рендеринг артефактов в моем приложении.

Edit: Для других людей с той же проблемой, я обнаружил, что этот пользователь сделал компонент, который решает эту проблему: http://blog.onedevjob.com/2011/12/11/fixing-wpf-gridsplitter/ все еще будет хорошо, если бы она могла быть решена с компонентами МОФ по умолчанию, хотя.

ответ

0

Интересная проблема. Одно очевидное решение - установить TextWrapping = «WrapWithOverflow» для хотя бы одного из элементов TextBlock, но я уверен, что это не было вашим намерением.

Другое обходное решение заключается в том, чтобы не дать разделителю его собственный столбец сетки и вместо этого разместить его во втором, последнем столбце. Кажется, это делает трюк:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Grid.Column="0"> 
     long string that does not fit within the textblock - long string that does not fit within the textblock 
    </TextBlock> 

    <GridSplitter Grid.Column="1" Margin="-25,0,0,0" HorizontalAlignment="Left" Width="50" Background="LightBlue" /> 

    <TextBlock Grid.Column="1" Margin="25,0,0,0"> 
     long string that does not fit within the textblock - long string that does not fit within the textblock 
    </TextBlock> 
</Grid> 
+0

Спасибо за ответ, на самом деле это не работает, это просто меняется, какая ширина окна сплиттер застревает. Ширина окна 403 для вышеприведенного кода все равно породит ошибку. – GulPaprika

Смежные вопросы