2017-02-20 64 views
1

我來自Windows窗體背景,我對控制顯示控件的最佳做法有些困惑。我正在研究一個我想要一些「眼睛糖果」的控件。在WinForms中,我會覆蓋Paint Event來執行任何可視化編程。我明白WPF的主要理由是將行動與展示分開。自定義控件模板,顯示和WPF

以下是我不確定的部分。假設我想在控件的「背景」中繪製一些簡單的線條。將這些行添加到模板中或者像在WinForms中那樣在代碼後面執行行繪製?

比如講我開發了一個名爲CustomControl1控制和想畫一條線,垂直居中,如控制的整個寬度:

CustomControl1

它會更好做線代碼隱藏或在模板中?

我完全可以做到在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> 

我不知道這是否是「最佳實踐」或者,如果有,我應該使用所有在一起的另一種方式?是否有一個理由使用另一個?是否有任何性能收益/損失?

+1

WPF控件的可視化結構通常由其Template屬性定義,該屬性在(默認)Style中設置。見例如在[ControlTemplate](https://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate(v = vs.110).aspx)頁上的* Remarks *和* Examples *部分MSDN。 [樣式和模板](https://msdn.microsoft.com/en-us/library/ms745683(v = vs.110).aspx)頁上的* Control Templates *部分也可能有所幫助。 – Clemens

回答

0

任何靜態應該在xaml中。例如,如果您知道此行始終始於此位置,則將其放在xaml中。 但是,如果該行是動態的,就像你可以有一個或多個線,角,曲線,不同的顏色等...你可能想自己初始化和設置您的用戶控件屬性。

0

IMO,你的代碼很好。對於WPF中的這種需求,沒有人會像在WinForms中那樣做「在代碼背後畫線條」。

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