[英]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.