Я пытаюсь изменить этот пример WPF Diagram Designer , чтобы элементы управления изменением размера оставались на месте, а элемент управления вращением поворачивает содержимое.
Я создаю холст исодержимое таким образом, как в примере:
<Grid>
<Canvas Background="AliceBlue">
<ContentControl Width="100" Height="100" Canvas.Top="50" Canvas.Left="50" Style="{StaticResource DesignerItemStyle}">
<Ellipse Fill="Blue" IsHitTestVisible="False"/>
</ContentControl>
</Canvas>
</Grid>
DesignerItemStyle выглядит следующим образом:
<Style x:Key="DesignerItemStyle" TargetType="ContentControl">
<Setter Property="MinHeight" Value="50"/>
<Setter Property="MinWidth" Value="50"/>
<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}}">
<thumbs:MoveThumb x:Name="MVThumb" Cursor="SizeAll" Template="{StaticResource MoveThumbTemplate}" />
<s:ResizeChrome x:Name="ResizeDecorator" Visibility="Collapsed"/>
<ContentControl Content="{TemplateBinding ContentControl.Content}" Style="{StaticResource RotatableDesignerItemStyle}"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, ElementName=MVThumb}" Value="True">
<Setter TargetName="ResizeDecorator" Property="Visibility" Value="Visible"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
А RotatableDesignerItemStyle выглядит следующим образом:
<Style x:Key="RotatableDesignerItemStyle" TargetType="ContentControl">
<Setter Property="MinHeight" Value="50"/>
<Setter Property="MinWidth" Value="50"/>
<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}}">
<s:RotateChrome x:Name="RotateDecorator" Visibility="Collapsed"/>
<ContentPresenter x:Name="CPresenter" Content="{TemplateBinding ContentControl.Content}"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, ElementName=MVThumb}" Value="True">
<Setter TargetName="RotateDecorator" Property="Visibility" Value="Visible"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ВRotateThumb, мой DragStarted начинается следующим образом (UIHelper происходит от здесь ):
private void RotateThumb_DragStarted(object sender, DragStartedEventArgs e)
{
this.designerItem = DataContext as ContentControl;
if (this.designerItem != null)
{
//this.canvas = VisualTreeHelper.GetParent(this.designerItem) as Canvas;
this.canvas = UIHelper.FindVisualParent<Canvas>(this.designerItem);
if (this.canvas != null)
{
this.centerPoint = this.designerItem.TranslatePoint(
new Point(this.designerItem.Width * this.designerItem.RenderTransformOrigin.X,
this.designerItem.Height * this.designerItem.RenderTransformOrigin.Y),
this.canvas);
...
Это работает до того момента, когда я начинаю использовать вращающийся большой палец:
Затем я попадаю в вышеупомянутую функцию DragStarted, где я вижу, что this.designerItem.Width (и Height) равен NaN.Я использовал Snoop, чтобы посмотреть на него:
Для 007 (76) в VisualTree Я вижу, что DataContext равен нулю
Для 008 (75) DataContext являетсяContentControl с допустимой шириной
Для 009 (15) DataContext - это ContentControl с действительной шириной
Для 010 (14) DataContext - это ContentControl с недействительным Ширина
Может кто-нибудь объяснить мнечто здесь происходит (я относительно новичок в WPF)?Как я могу решить эту проблему (designerItem.Width является NaN, и поэтому вращение не работает)?