动态创建的形状面板,内部具有嵌套控件(也可以动态创建),也具有自定义形状

时间:2018-12-30 19:43:51

标签: c# wpf wpf-controls nested-controls

我目前有一个从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时却无法正常工作。我找不到其他有关如何执行此操作的示例。感谢您的任何帮助,谢谢!

1 个答案:

答案 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元素(请参见herehere有关更多信息)。