2010-05-25 113 views
0

我想對複選框的默認模板做一些小的調整。現在我明白如何從頭開始創建一個新模板,但我不知道。我設法(我想?)通過方法here提取默認模板。有沒有辦法根據默認模板編輯控件的模板?

它吐出來:

<ControlTemplate TargetType="CheckBox" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:s="clr-namespace:System;assembly=mscorlib" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"> 
     <BulletDecorator Background="#00FFFFFF" SnapsToDevicePixels="True"> 
      <BulletDecorator.Bullet> 
       <mwt:BulletChrome Background="{TemplateBinding Panel.Background}" 
            BorderBrush="{TemplateBinding Border.BorderBrush}" 
            BorderThickness="{TemplateBinding Border.BorderThickness}" 
            RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
            RenderPressed="{TemplateBinding ButtonBase.IsPressed}" 
            IsChecked="{TemplateBinding ToggleButton.IsChecked}" /> 
      </BulletDecorator.Bullet> 
      <ContentPresenter RecognizesAccessKey="True" 
           Content="{TemplateBinding ContentControl.Content}" 
           ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
           ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
           Margin="{TemplateBinding Control.Padding}" 
           HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
           SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
     </BulletDecorator> 
     <ControlTemplate.Triggers> 
      <Trigger Property="ContentControl.HasContent"> 
       <Setter Property="FrameworkElement.FocusVisualStyle"> 
        <Setter.Value> 
         <Style TargetType="IFrameworkInputElement"> 
          <Style.Resources> 
           <ResourceDictionary /> 
          </Style.Resources> 
          <Setter Property="Control.Template"> 
           <Setter.Value> 
            <ControlTemplate> 
             <Rectangle Stroke="#FF000000" 
                StrokeThickness="1" 
                StrokeDashArray="1 2" 
                Margin="14,0,0,0" 
                SnapsToDevicePixels="True" /> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="Control.Padding"> 
        <Setter.Value> 
         <Thickness>2,0,0,0</Thickness> 
        </Setter.Value> 
       </Setter> 
       <Trigger.Value> 
        <s:Boolean>True</s:Boolean> 
       </Trigger.Value> 
      </Trigger> 
      <Trigger Property="UIElement.IsEnabled"> 
       <Setter Property="TextElement.Foreground"> 
        <Setter.Value> 
         <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> 
        </Setter.Value> 
       </Setter> 
       <Trigger.Value> 
        <s:Boolean>False</s:Boolean> 
       </Trigger.Value> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

好吧,當然,看起來只有精細,我猜。我沒有足夠的經驗來知道這看起來是否正確。現在,我得到兩個錯誤:

大會 'PresentationFramework.Luna' 沒有被發現。確認你不是 缺少裝配參考。此外, 驗證您的項目和所有 引用程序集已建成。

類型 'MWT:BulletChrome' 沒有 發現。確認您沒有錯過 程序集參考,並且所有 引用程序集都已構建。

現在我想知道,我該如何解決這些錯誤,以便我可以真正開始在模板上工作?有沒有更好的方法來解決這個問題?我的老闆想要一個帶紅色方塊而不是綠色的三態複選框,他不會拒絕回答。

回答

2

要解決這兩個錯誤,添加到PresentationFramework.Luna引用(這是在GAC所以你會選擇當VS添加引用在.NET選項卡中找到它)。

但是,請注意,月神主題將只默認使用如果Windows XP的主題是月神(默認的)。如果您在顯示設置中更改主題,則您複選框將保留Luna主題,因爲您重用了Luna模板。

時如果所述模板還沒有被擺在首位設計成這樣只能編輯現有模板的一部分,沒有別的辦法。

+0

我很好,讓我的複選框走出「主題」。更重要的是我只是想改變那個盒子是紅色的! – 2010-05-25 20:29:07

2

修改現有的模板的各部分的唯一方法是完全地覆蓋(的複製)。你可以很容易地做到這一點(它會立即編譯 - 無需手動引用任何內容)與表達式混合(編輯模板 - >編輯副本)。

有你必須保持介意與CONTROLTEMPLATES一兩件事:

沒有爲每個稱爲 OS主題(月神,航空等)單獨的ControlTemplate因此控制將尋找正確的每個下OS主題。如果你重寫它,那麼情況就不是這樣了,它在每個操作系統下的每個主題下總會看起來一樣。在你的情況下,即使你在Vista,Win7或Battleship-Gray-Theme上運行應用程序,它總是看起來像Windows XP Luna(因爲你選擇Luna ControlTemplate作爲起點)。

所以在一定程度上覆蓋CONTROLTEMPLATES是由設計缺陷。當然,你可以爲每個已知的操作系統主題提供一個ControlTemplate,但是如果有新的操作系統,這將無濟於事。

0

Windows SDK中包含的所有控件模板都不是完整的副本嗎?