簡體   English   中英

自定義控件模板,顯示和WPF

[英]Custom Control Templates, Display and WPF

我來自Windows窗體背景,我對控制控件顯示的最佳實踐有點困惑。 我正在制作一個控制器,我想要一些“眼睛糖果”。 在WinForms中,我會覆蓋Paint事件來進行任何類型的可視化編程。 我知道WPF構思的主要原因是將Action與Display分開。

這是我不確定的部分。 假設我想在控件的“背景”中繪制一些簡單的線條。 將這些行添加到模板中或者在WinForms中執行代碼后面的行繪制是最佳實踐嗎?

例如,我說我正在開發一個名為CustomControl1的Control,並希望繪制一條直線居中的控件的整個寬度,如:

CustomControl1

在Code Behind或模板中執行該行會更好嗎?

我可以完全在xaml中完成它,如下所示:

<Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Padding="{TemplateBinding Padding}"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">

                        <Grid HorizontalAlignment="Left" Width="{Binding ActualWidth}">

                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Aqua">
                                <Path Stretch="Fill" Stroke="Black" StrokeThickness="1" Data="M 0,0.5 H 1" />
                            </Border>

                            <TextBlock 
                                    HorizontalAlignment="Center"
                                    Text="Some Text" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我不確定這是“最佳實踐”還是我還有其他方法可以一起使用? 是否有一個理由使用一個而不是另一個? 是否有任何績效收益/虧損?

任何靜態都應該在xaml中。 例如,如果您知道此行總是從此位置開始,使用此大小,請將其放在xaml中。 但是如果線條是動態的,就像你可以有一條或多條線條,角度,曲線,不同的顏色等...你可能想要自己初始化它並在你的用戶控件中設置屬性。

IMO,你的代碼很好。 對於WPF中的這種要求,沒有人會像在WinForms中那樣“在代碼背后繪制線條”。

使用ControlTemplate和Style控制控件的顯示是WPF中的最佳和推薦方法。 此外,如果您需要代碼中的控件,則可以使用OnApplyTemplate覆蓋自定義控件中的GetTemplateChild方法獲取ControlTemplate中定義的控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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