none
Странное поведение контрола GridSplitter в WPF. RRS feed

  • Вопрос

  • Всем добрый вечер!

     

    С установкой .NET F-k 4.0 и перевода проекта на него с .NET F-k 3.5 обнаружил странное и очень раздражающее поведение контрола GridSplitter в WPF. Постараюсь описать максимально понятно ситуацию.

    Есть Grid. Внутри него разделение на 3 области. Центральная и боковые, как в VS. Чтобы было удобно, добавил сплиттеры, чтобы можно было скрывать если не нужно боковые области. 

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

    Очень неприятная проблема и раздражает очень сильно. Сталкивался ли кто-нибудь с подобным?

     

    Буду благодарен за любую помощь!


    E-mail: Svatoslav.Pankratov@gmail.com
    28 октября 2010 г. 19:39

Ответы

  • Удивительно, но как выяснилось, данная проблема наблюдается уже на протяжении 3-х с лишним лет. О ней уже писали в connect, но как видно никакого действия со стороны Microsoft Не происходит. =( Очень печально.

    Действительно же решает данную проблему пока что только установление следующего свойства у сплиттера ShowsPreview="True" которое позволяет отключить перерисовку содержимого, пока не установлено конкретное значение положения сплиттера (не отпущена кнопка мыши).


    E-mail: Svatoslav.Pankratov@gmail.com
    • Предложено в качестве ответа ulcerModerator 31 октября 2010 г. 9:08
    • Помечено в качестве ответа Svyatoslav Pankratov 31 октября 2010 г. 9:11
    30 октября 2010 г. 12:39

Все ответы

  • Вот ссылка на проект, в котором можно наблюдать данный феномен.
    E-mail: Svatoslav.Pankratov@gmail.com
    28 октября 2010 г. 20:19
  • При изучении данного феномена другими лицами с форума RSDN были так же замечены еще ряд проблем с контролами.

    Цитирую:

    Ппц. У меня такой феномен наблюдается: если у окна в этом проекте просто убрать Width="640" Height="480" , то при запуске программа висит и съедает 100% процессорного времени! Возвращаешь Width="640" Height="480" обратно, и она хотя бы запускается.
    Сменил Target Framework на .NET 3.5 Client Profile, эффект Width="640" Height="480" пропал. В том смысле, что ни с Width="640" Height="480" , ни без них, программа не запускается — виснет. Теперь помогает убрать WindowState="Maximized"  Тогда запускается и с Width="640" Height="480".

    Ты написал Убийцу .NET!


    E-mail: Svatoslav.Pankratov@gmail.com
    29 октября 2010 г. 20:36
  • А решение всех проблем простое до безобразия )))
    			<Grid.ColumnDefinitions>
    				<ColumnDefinition Width="*" />
    				<ColumnDefinition Width="7" />
    				<ColumnDefinition Width="2*" />
    				<ColumnDefinition Width="7" />
    				<ColumnDefinition Width="*" />
    			</Grid.ColumnDefinitions>
    

    30 октября 2010 г. 9:25
    Модератор
  • Забавно! Почти помогло. Но иногда баг всеравно проскакивает =(

    Особенно это заметно, если сплиттеры вывести поверх кружков, украшающих его и добавить прозрачность для него (сплиттера).


    E-mail: Svatoslav.Pankratov@gmail.com
    30 октября 2010 г. 11:23
  • Удивительно, но как выяснилось, данная проблема наблюдается уже на протяжении 3-х с лишним лет. О ней уже писали в connect, но как видно никакого действия со стороны Microsoft Не происходит. =( Очень печально.

    Действительно же решает данную проблему пока что только установление следующего свойства у сплиттера ShowsPreview="True" которое позволяет отключить перерисовку содержимого, пока не установлено конкретное значение положения сплиттера (не отпущена кнопка мыши).


    E-mail: Svatoslav.Pankratov@gmail.com
    • Предложено в качестве ответа ulcerModerator 31 октября 2010 г. 9:08
    • Помечено в качестве ответа Svyatoslav Pankratov 31 октября 2010 г. 9:11
    30 октября 2010 г. 12:39
  • Теперь становится понятно почему в VS 2010 когда производим ресайз границ, у нас ничего не перерисовывается, а передвигается только "тень" границы. Те они знают и ничего не исправляют. Причем сами же просто тупо обходят эти грабли. Хотя бы в документации писали о существующем баге =(
    E-mail: Svatoslav.Pankratov@gmail.com
    31 октября 2010 г. 9:11
  • На моей машине перестает прыгать после прописывания нормальной ширины у колонок (целочисленной для контента и автоматической, а не “7 с потолка” для сплиттера. И запихивания шаблона сплиттера в ControlTemplate сплиттера, а не просто в ту же ячейку.
     
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="5*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="2*" MinWidth
    ="100" />
    </
    Grid.ColumnDefinitions>
    ...
    <GridSplitter Background="#FFF7FAFF" HorizontalAlignment="Center" VerticalAlignment="Stretch" Grid.Column="1">
        <GridSplitter.Template>
            <ControlTemplate>
                <Grid Height="25" HorizontalAlignment="Center" VerticalAlignment="Center" Width="7" d:IsLocked="True">
                    <Ellipse Fill="#FFBEBEBE" Height="7" Stroke="#FF545454" VerticalAlignment="Top">
                        <Ellipse.Effect>
                            <DropShadowEffect Color="#FF979797" Opacity="0.485" ShadowDepth="2"/>
                        </Ellipse.Effect>
                    </Ellipse>
                    <Ellipse Fill="#FFBEBEBE" Margin="0,6.646,0,6.605" Stroke="#FF545454" Height="7">
                        <Ellipse.Effect>
                            <DropShadowEffect Color="#FF979797" Opacity="0.485" ShadowDepth="2" />
                        </Ellipse.Effect>
                    </Ellipse>
                    <Ellipse Fill="#FFBEBEBE" Height="7" Stroke="#FF545454" VerticalAlignment="Bottom">
                        <Ellipse.Effect>
                            <DropShadowEffect Color="#FF979797" Opacity="0.485" ShadowDepth="2" />
                        </Ellipse.Effect>
                    </Ellipse>
                </Grid>
            </ControlTemplate>
        </GridSplitter.Template
    >
    </
    GridSplitter>

    31 октября 2010 г. 17:52
  • Большое спасибо Павел, Ваш способ вроде как работает. По крайней мере при таком раскладе дел, проблем на данном этапе не наблюдается.
    E-mail: Svatoslav.Pankratov@gmail.com
    1 ноября 2010 г. 16:41
  • В любом случае - стоит проголосовать за баг на connect. Чинить проект битьем в бубен - нехорошо :(
    1 ноября 2010 г. 17:27