WPF, добавляющий путь к ContentControl, не работает во время выполнения

#c# #wpf

#c# #wpf

Вопрос:

У меня есть программа, которая добавит любой объект в canvas во время выполнения. Я использую ContentControl в соответствии с требованиями. ContentControl будет привязан к перетаскиванию, изменению размера и повороту, поэтому мы не можем использовать другой объект. Элементы будут добавлены во время выполнения, и все созданные элементы управления будут добавлены на canvas в конце. Приведенный ниже код просто добавляет два объекта — эллипс и геометрию. На холсте отображается эллипс, но не геометрия. Однако, если он добавлен непосредственно в XAML, он отображается. Если в коде, стоящем за добавлением пути непосредственно как дочернего элемента canvas, он также работает. Пожалуйста, помогите. Как отобразить эту геометрическую форму с помощью кода во время выполнения при добавлении в ContentControl.

НЕ РАБОТАЕТ

C#

   public partial class Window1 : Window
    {
        
        public Window1()
        {
            InitializeComponent();
            AddItemsToCanvas();
        }

        void AddItemsToCanvas()
        {
            //add Ellipse
            var contentControl = new ContentControl();
            contentControl.Width = 130;
            contentControl.Height = 130;
            contentControl.MinHeight = 5;
            contentControl.MinWidth = 5;
            Canvas.SetTop(contentControl, 50);
            Canvas.SetLeft(contentControl, 100);
            var ellipse = new Ellipse { Fill = Brushes.Blue, Stretch = Stretch.Fill, IsHitTestVisible = false };
            var border = new Border { Background = Brushes.Transparent, VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch };
            border.Child = ellipse;
            contentControl.Content = border;
            canvas.Children.Add(contentControl);

            //add geometry. This doesn't work.
            var contentGeomControl = new ContentControl();
            contentGeomControl.Width = 130;
            contentGeomControl.Height = 130;
            contentGeomControl.MinHeight = 5;
            contentGeomControl.MinWidth = 5;
            Canvas.SetTop(contentGeomControl, 50);
            Canvas.SetLeft(contentGeomControl, 100);
            var streamGeometry = StreamGeometry.Parse("M150,300 L300,300 A150,150 0 0 0 256,194 z");
            var path = new Path { Data = streamGeometry, Fill = Brushes.Wheat, IsHitTestVisible = false };
            var borderGeom = new Border { Background = Brushes.Transparent, VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch };
            borderGeom.Child = path;
            contentGeomControl.Content = borderGeom;
            canvas.Children.Add(contentGeomControl);
        }
    }
}
  

XAML

 <Window x:Class="DiagramDesigner.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    WindowStartupLocation="CenterScreen"
    Title="Move, resize and rotate"
    Height="550" Width="750" Name="Win1">
<Window.Resources>
 <Canvas Name="canvas" Background="White" Opacity="99">
    
</Canvas>
  

ЭТО РАБОТАЕТ, НО НАМ НУЖНО ДОБАВЛЯТЬ ЭЛЕМЕНТЫ ВО ВРЕМЯ ВЫПОЛНЕНИЯ

 XAML
  

 <Canvas Name="canvas" Background="White" Opacity="99">
    <ContentControl>
        <ContentControl.Content>
            <Border >
                <Path Fill="Wheat" Data="M150,300 L300,300 A150,150 0 0 0 256,194 z"/>
            </Border>
        </ContentControl.Content>
    </ContentControl>
</Canvas>
  

Ответ №1:

Вы устанавливаете свойства Width , Height MinHeight MinWidth Canvas.Top и Canvas.Left в своем коде, но не в вашем XAML. В этом разница. Попробуйте удалить эти строки:

 var contentGeomControl = new ContentControl();
var streamGeometry = StreamGeometry.Parse("M150,300 L300,300 A150,150 0 0 0 256,194 z");
var path = new Path { Data = streamGeometry, Fill = Brushes.Wheat, IsHitTestVisible = false };
var borderGeom = new Border { Background = Brushes.Transparent, VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch };
borderGeom.Child = path;
contentGeomControl.Content = borderGeom;
canvas.Children.Add(contentGeomControl);
  

Тогда вы должны увидеть те же результаты.

Комментарии:

1. Большое вам спасибо! Я часами выяснял, в чем проблема.