Связывание во вложенных ContentConrols - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь изменить этот пример 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);
...

Это работает до того момента, когда я начинаю использовать вращающийся большой палец: enter image description here

Затем я попадаю в вышеупомянутую функцию DragStarted, где я вижу, что this.designerItem.Width (и Height) равен NaN.Я использовал Snoop, чтобы посмотреть на него: enter image description here

Для 007 (76) в VisualTree Я вижу, что DataContext равен нулю
Для 008 (75) DataContext являетсяContentControl с допустимой шириной
Для 009 (15) DataContext - это ContentControl с действительной шириной
Для 010 (14) DataContext - это ContentControl с недействительным Ширина

Может кто-нибудь объяснить мнечто здесь происходит (я относительно новичок в WPF)?Как я могу решить эту проблему (designerItem.Width является NaN, и поэтому вращение не работает)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...