2011-07-14 94 views
4

當我在WPF中創建自定義控件並將其添加到窗口時,我沒有看到任何將它放在對話框中的地方。下面是我在做什麼:WPF自定義控件不可見

  1. 創建一個新的WPF應用程序
  2. 添加 - >新項... - >自定義控制(WPF): 「CustomButton.cs」
  3. 我改變的CustomButton基地類到按鈕而不是控件
  4. 將CustomButton控件添加到我的主窗口。
  5. 當我運行應用程序或在設計器中查看主窗口時,我什麼都看不到。

下面是代碼的樣子。

CustomButton.cs:

public class CustomButton : Button 
{ 
    static CustomButton() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), 
      new FrameworkPropertyMetadata(typeof(CustomButton))); 
    } 
} 

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1"> 
    <Grid> 
     <my:CustomButton Content="Hello World" x:Name="customButton1" 
         HorizontalAlignment="Left" VerticalAlignment="Top" Margin="150,175,0,0" /> 
    </Grid> 
</Window> 

Generic.xaml:

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

我發現兩條引線,以這是怎麼回事,但沒有點擊。當我添加自定義控件時,Visual Studio添加了Themes/Generic.xaml,但無論我在那裏嘗試什麼,我都看不到屏幕上的差異。另一件事是,如果我在CustomButton.cs中註釋掉靜態構造函數,突然間在主窗口中顯示按鈕。它在所有情況下看起來都不是很正確,但是(就像我在工具欄中使用按鈕一樣)。

回答

9

您的自定義控件模板在哪裏?

按說

 DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), 
     new FrameworkPropertyMetadata(typeof(CustomButton))); 

就表示要定義自己的自定義控制。我想如果你刪除它,你會看到你的按鈕。

+0

你是對的,當我刪除它出現。就像我說的那樣,它增加了Generic。看起來像它有自定義控件模板的xaml。我已經將這一點添加到了主要問題中。 – Jason

+1

它看起來不像模板:)它只會繪製一個(可能是空的)邊框。 – Jeff

+0

另外,它聽起來並不像你想在這裏做一個自定義控件......你呢?看起來你只是想要一個Button的自定義子類。 – Jeff

6

我想你已經找到了解決問題的同時。 但是,對於這種情況,其他任何人都會遇到同樣的問題: 可能只是解釋爲什麼自定義控件沒有顯示出來,儘管創建它的所有步驟都已正確完成,正如您所做的那樣,這是一個缺失進入AssemblyInfo.cs。 此文件必須包含以下條目:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly))] 

如果沒有此項,generic.xaml文件將被忽略,因此默認的控制模板是找不到的,所以控制不會得到控制模板根本不會出現。這也解釋了爲什麼當你禁用靜態構造函數時,你的控件突然顯示出來了。該行:

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton))); 

告訴控件使用它自己的默認樣式,而不是從它的基類繼承它。因此,如果沒有這一行,CustomButton將簡單地重用Button-class的默認控制模板,結果是,您寫入generic.xaml的任何內容都不會對CustomButton產生任何影響。