Синхронизировать между визуальным заполнителем и ContentPresenter?

Я создаю программу для редактирования фотографий (например, копию фотошопа).
а также с помощью этого средства изменения размера / перемещения: https://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part(я попытался выяснить, как это работает)

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


Итак, что я хотел бы сделать, это синхронизировать их обоих. даже пользователь манипулирует линией.

Вот мой код для стиля управления контентом.

<ControlTemplate x:Key="MoveThumbLineTemplate"  TargetType="{x:Type m:MoveThumb}">
    <Line Fill="Orange" Stroke="Orange" StrokeThickness="2px" X1="0" X2="100" Y1="100" Y2="200"/>
</ControlTemplate>

    <Style x:Key="DesignerItemStyleForLine" TargetType="ContentControl">
    <Setter Property="MinHeight" Value="10"/>
    <Setter Property="MinWidth" Value="10"/>
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                    <m:MoveThumb x:Name="thumb" Cursor="Cross" Template="{StaticResource MoveThumbLineTemplate}" />
                    <ContentPresenter Content="{TemplateBinding ContentControl.Content}"
                          Margin="{TemplateBinding Padding}"/>
                    <local:DesignerItemDecorator x:Name="ItemDecorator"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="Selector.IsSelected" Value="True">
                        <Setter TargetName="ItemDecorator" Property="ShowDecorator" Value="True"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Contentcontrol имеет строку в качестве своего содержания.LineAdorner покрывает линию.Movethumb это оранжевый заполнитель. Как только он выбран, он вызывает ShowDecorator() в классе DesignerItemDecorator.ShowDecorator функция назначает LineAdorner в CustomControl который имеет форму линии.

Я попробовал этот метод, чтобы сделать обе строки одинаковыми в Movethumb учебный класс. но это работает только тогда, когда пользователи начинают перетаскивать.

    private void MoveThumb_DragStarted(object sender, DragStartedEventArgs e)
    {
        this.designerItem = DataContext as ContentControl;

        if (this.designerItem != null)
        {
            if (VisualChildrenCount == 1)
            {
                //Console.WriteLine("movethumb : " + designerItem.Content.GetType().ToString());
                var v = GetVisualChild(0) as Line;  // visual from content template
                var v2 = designerItem.Content as Line;  // visual from actual line
                if (v != null && v2 != null)
                {
                    v.X1 = v2.X1;
                    v.X2 = v2.X2;
                    v.Y1 = v2.Y1;
                    v.Y2 = v2.Y2;
                }
            }

            this.rotateTransform = this.designerItem.RenderTransform as RotateTransform;
        }
    }

Вот воспроизвести видео, чтобы быть ясным. Есть идеи?

0 ответов

Другие вопросы по тегам