вторник, 29 января 2013 г.

Перемещение/resize окна в WPF

Проблема: хочу сделать окно со своим дизайном на WPF, но при убирании бордюра (NoBorder) оно перестает ресайзиться и двигаться за заголовок

Решение: Специально для этого в 7 и Vista есть библиотечка с пространством имен Microsoft.Windows.Shell, физически лежащим в PresentationFramework.dll. Там есть класс WindowChrome. Это лучше понимать как "хром окна", но по факту не только окна, но и любого элемента. Он содержит в себе набор attached-пропертей для манипулирования неклиентской областью окна. Пример:

<Style TargetType="{x:Type Window}">
        <Setter Property="shell:WindowChrome.WindowChrome">
            <Setter.Value>
                <shell:WindowChrome 
                                    CaptionHeight="24"
                                    CornerRadius="0"
                                    GlassFrameThickness="0,0,0,-1"
                                    NonClientFrameEdges="None"
                                    ResizeBorderThickness="7"
                                    UseAeroCaptionButtons="False"/>
            </Setter.Value>
        </Setter>
</Style>

Тут можно задать высоту невидимого заголовка и толщину невидимых бордюров для изменения размеров. Невидимый заголовок в данном случае будет - полоска сверху окна высотой в 24px, за которую можно будет потянуть и перетащить окно. Если вам нужно разместить в этой зоне еще какие-нибудь элементы - не забудьте проставить им 

shell:WindowChrome.IsHitTestVisibleInChrome="True"

А для ResizeGrip (или за что у вас там тянется, чтобы изменить размер окна):

shell:WindowChrome.ResizeGripDirection="BottomRight"

И все проблемы с перемещением окна будут решены.

Комментариев нет:

Отправить комментарий