Синхронизировать между визуальным заполнителем и 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;
}
}
Вот воспроизвести видео, чтобы быть ясным. Есть идеи?