Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещаемый элемент внутри Adorner'a в WPF 
V
    Опции темы
Anyone
Дата 1.10.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Создал сложный Adorner, который позволит изменять размеры, вращать объект, а также планируется изменять центр вращения с помощью перемещающегося элемента(центр изображен красным цветом на рисунке).
Перемещение центра осуществляется с помощью свойства Margin.

Из рис. видно что ниже и правее объекта перемещаемый элемент адорнера обрезается.
Еще я не могу понять почему если переместить центр адорнера в верхнюю точку объкета, значение Margin.Left, Margin.Top равно приблизительно значению соответственно ActualWidth, ActualHeight объекта, а если его переместить в нижнюю точку объекта, то значение Margin.Left, Margin.Top примерно в 2 раза меньше (видно на рисунке)...

Привожу код:
Код

    <Style TargetType="{x:Type Shape}" x:Key="ThumbCenter">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="Stroke" Value="#FFC8C8C8" />
        <Setter Property="StrokeThickness" Value=".5" />
        <Setter Property="Width" Value="10" />
        <Setter Property="Height" Value="10" />
        <Setter Property="Margin" Value="-2" />
        <Setter Property="Fill">
            <Setter.Value>
                <RadialGradientBrush Center="0.2, 0.2" GradientOrigin="0.2, 0.2" RadiusX="0.8" RadiusY="0.8">
                    <GradientStop Color="White" Offset="0.0" />
                    <GradientStop Color="Red" Offset="0.8" />
                </RadialGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
    
    <Style x:Key="CenterThumb_Style" TargetType="{x:Type t:CenterThumb}">
        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                            <Label x:Name="PART_CenterThumbCoordinates" Margin="0,-30,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Visible"/>
                            <Rectangle Stretch="Fill" Width="100" Height="100" Stroke="Black" />
                            <Ellipse Style="{StaticResource ThumbCenter}" HorizontalAlignment="Center"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
    
    <Style TargetType="{x:Type local:ResizeRotateChrome}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ResizeRotateChrome}">
                    <Grid>
                        <Grid Opacity="0" Margin="-3">
                            <t:RotateThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                            <t:ResizeThumb .../>
                          </Grid>
                       <Grid IsHitTestVisible="False" Opacity="1" Margin="-3">
                            <Rectangle .../>
                            <Line .../>
                            <Ellipse .../>
                            <Ellipse .../>
                            <Ellipse .../>
                            <Ellipse .../>
                            <Ellipse .../>
                        </Grid>
                        <t:CenterThumb Style="{StaticResource CenterThumb_Style}" Cursor="Cross" Width="100" Height="100"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Код

    public class CenterThumb : Thumb
    {
        public CenterThumb()
        {
            DragDelta += new DragDeltaEventHandler(CenterThumb_DragDelta); 
        }

        void CenterThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            Margin = new System.Windows.Thickness(
                Margin.Left + e.HorizontalChange, Margin.Top + e.VerticalChange, 
                Margin.Right, Margin.Bottom);
        }
    }

Следует обратить внимание на t:CenterThumb.
У меня 2 вопроса: почему адорнер обрезается, причем только справа и снизу объекта, и почему значение Margin так неравномерно изменяется при перемещении адорнера относительно объекта?
Спасибо.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Screen.JPG 14,06 Kb
PM MAIL   Вверх
math64
Дата 1.10.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Чтобы не обрезался, нужно задать правый и нижний Margin'ы отрицательными, чтобы весь CenterThumb поместился в отведённую ему ячейку Grid (с учётом размера полей). Когда же область для размещения CenterThumb больше его размеров, он помещается по центру - а поскольку правый и нижний Margin'ы не регулируются, то он смещается толко наполовину.
Кстати адорнеры тут не причём - всё разместится также и при использовании обычного элемента.
PM   Вверх
Anyone
Дата 1.10.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(math64 @  1.10.2009,  13:29 Найти цитируемый пост)
Чтобы не обрезался, нужно задать правый и нижний Margin'ы отрицательными

Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.