我目前有一个从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>画布以向其中添加更多内容?另外,每个控件实例的内容都不同。
我看到this post提出了一个非常相似的问题,但是答案是口头描述,我不知道该如何实现。我还发现了许多在xaml中编写静态UI的解决方案,但是当我尝试在C#中重新创建静态UI时却无法正常工作。我找不到其他有关如何执行此操作的示例。感谢您的任何帮助,谢谢!
答案 0 :(得分:0)
如果您正确地做事并使用数据绑定而不是直接操作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元素(请参见here和here有关更多信息)。