#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. Большое вам спасибо! Я часами выяснял, в чем проблема.