2013-10-14 48 views
0

在WPF我從Button類繼承:WPF設計不能申請樣式

public class MenuButton : Button 
    { 
     public MenuButton() 
     { 
      this.Style = FindResource("MenuButton") as Style; 
     } 
     public MenuButton(string caption, ICommand command) 
     : this() 
    { 
     SetValue(ContentProperty, caption); 
     this.command = command; 
    } 
} 

在一個窗口,我增加了一個控制

<c:MenuButtons x:Name="MenuProject" c:MenuItems="{x:Static d:MenuItems.Project}" /> 

其中C:恩d:是我的命名空間。 MenuItems是用戶控件MenuButtons的一個DependencyProperty,並在一個類被聲明如下:

public readonly static MenuButton[] Project = new MenuButton[] { new MenuButton("Open", new Command()), ..etc };

資源的定義如下:

<Style x:Key="MenuButton" 
      BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" 
      TargetType="{x:Type c:MenuButton}"> 

Visual Studio的設計師說: '菜單按鈕' 的TargetType不匹配元素「MenuButton」的類型。代碼運行良好,但設計者無法調用我的MenuButton類的構造函數。當註釋掉該行時,錯誤消失,但是樣式不適用,反之亦然。

+0

不知道,如果是相關的,但是'this.Style = FindResource(「菜單按鈕」)的風格;'不應該在構造函數中。你可以重寫'OnApplyTemplate()'方法並在那裏應用。 –

+0

這有幫助!其效果是該樣式在運行時不在設計時應用,至少沒有錯誤。爲什麼樣式不允許在構造函數中使用? – Gerard

+0

查看Jon的回答我的[問題](http://stackoverflow.com/questions/19363082/why-does-resources-cannot-be-fetched-in-a-controls-constructor)。 –

回答

1

this.Style = FindResource("MenuButton") as Style;不應出現在構造函數中。

您可以將它在OnApplyTemplate方法

public overrride OnApplyTemplate() 
{ 
    this.Style = FindResource("MenuButton") as Style; 
    base.OnApplyTemplate(); 
} 

希望這有助於

+1

任何想法如何在設計時應用風格? – Gerard