簡體   English   中英

動態創建的形狀面板,內部帶有嵌套控件(也可以動態創建),也具有自定義形狀

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM