[英]Dynamically created shaped panel with nested controls (also dynamically created) inside, which also have custom shapes
我目前有一个继承自Control的类,并通过将其样式设置为xaml资源中定义的样式来为其提供自定义形状:
<Style x:Key="ParameterStyle" TargetType="{x:Type local:ParameterUI}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ParameterUI}">
<Canvas>
<Ellipse
x:Name="component"
HorizontalAlignment="Left" Height="50"
Margin="0,0,0,50" Stroke="#FF8E8E9F"
VerticalAlignment="Top" Width="50"
StrokeThickness="1.5" Fill="#FF202020"/>
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我能够在此控件上定义各种鼠标事件,并使它按我的意愿运行。 现在,我想在此控件中动态添加嵌套控件,并且我希望这些嵌套控件中的每个控件都具有自定义形状,鼠标事件等,所有这些都在运行时定义。 几乎没有一个UI是静态的,因此所有UI都是在运行时定义的。 我尝试添加控件,按钮作为可视子级,逻辑子级,并且UI中什么都没有显示。 我什至在实时视觉树中都看不到任何东西。 我在这里做错了什么? 我应该采取其他方法吗? 如何在运行时访问样式> Setter.Value> ControlTemplate>画布以向其中添加更多内容? 同样,控件的每个实例的内容也不同。
我看到这篇文章提出了一个非常类似的问题,但答案只是口头描述,我不知道该如何实现。 我还发现了许多在xaml中编写静态UI的解决方案,但是当我尝试在C#中重新创建静态UI时却无法正常工作。 我找不到其他有关如何执行此操作的示例。 任何帮助表示赞赏,谢谢!
如果您正确地做事并使用数据绑定而不是直接操作GUI元素,那么将来您会避免很多麻烦,但是如果您坚持要...
您需要使用Visual Tree Helper遍历控件才能找到模板化的框架元素。 您可能还需要先调用ApplyTemplate
来确保您的控件已被模板化并可以访问:
yourTemplatedControl.ApplyTemplate();
var canvas = VisualTreeHelper.GetChild(yourTemplatedControl, 0) as Canvas;
var ellipse = new Ellipse();
ellipse.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
ellipse.VerticalAlignment = System.Windows.VerticalAlignment.Top;
ellipse.Width = 50;
ellipse.Height = 50;
ellipse.Margin = new Thickness(0, 0, 0, 50);
ellipse.Stroke = Brushes.Blue;
ellipse.StrokeThickness = 1.5;
ellipse.Fill = Brushes.Yellow;
canvas.Children.Add(ellipse);
在这段代码中,我只是假设模板中的第一个元素是Canvas,实际上,您可能更愿意在可视树中搜索canvas元素(有关更多信息,请参见此处和此处 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.