2012-11-20 63 views
0

在我當前的項目中,我有這個XAML文件,我定義了必須應用於不同類型的自定義小部件的視覺樣式。在XAML中定義矩形的控件模板

例如,風格爲「DirectLineButton」(自定義,從WPF的按鈕將繼承類)如下:

<Style x:Key="DirectLineButtonTemplate" TargetType="{x:Type View:DirectLineButton}"> 
<Setter Property="SnapsToDevicePixels" Value="true"/> 
<Setter Property="OverridesDefaultStyle" Value="true"/> 
<Setter Property="MinHeight" Value="23"/> 
<Setter Property="MinWidth" Value="75"/> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <Border x:Name="MyBorder" 
       CornerRadius="2" 
       BorderThickness="2" 
       Background="Gold" 
       BorderBrush="Gray"> 
     <ContentPresenter Margin="2" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
      RecognizesAccessKey="True"/> 
     </Border> 
     <ControlTemplate.Triggers> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineAvailable"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Gold"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineIdle"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Silver"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineBusy"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Green"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineCalled"> 
      <Setter TargetName="MyBorder" Property="Background" Value="LightBlue"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

現在,我需要通過定義一個矩形樣式複製這個想法。不幸的是,當我嘗試爲一個矩形定義一個ControlTemplate時,WPF會標記一條錯誤消息,你能提出一個解決方法嗎?看下面的代碼我試圖嘗試:

<Style x:Key="MyRectangleTemplate" TargetType="{x:Type Rectangle}"> 
<Setter Property="SnapsToDevicePixels" Value="true"/> 
<Setter Property="OverridesDefaultStyle" Value="true"/> 
<Setter Property="MinHeight" Value="23"/> 
<Setter Property="MinWidth" Value="75"/> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type Rectangle}"> 
     <Border x:Name="MyBorder" 
       CornerRadius="2" 
       BorderThickness="2" 
       Background="Gold" 
       BorderBrush="Gray"> 
     <ContentPresenter Margin="2" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
      RecognizesAccessKey="True"/> 
     </Border> 
     <ControlTemplate.Triggers> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineAvailable"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Gold"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineIdle"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Silver"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineBusy"> 
      <Setter TargetName="MyBorder" Property="Background" Value="Green"/> 
     </Trigger> 
     <Trigger Property="View:DirectLineButton.State" Value="DirectLineCalled"> 
      <Setter TargetName="MyBorder" Property="Background" Value="LightBlue"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

在此先感謝!

回答

1

嗨,你將不得不使用邊框only.Controls繼承FrameworkElement只能有模板。但矩形,線等是更輕的版本,他們只繼承UIElement而不是FrameworkElement.I希望這會有所幫助。結論:Rectange沒有模板屬性

+0

實際上,'Rectangle'從'FrameworkElement'衍生設置適當DataContext。控制模板僅適用於...控件:) –

+0

是的,我的不好,我有點困惑,它只是VisualStudio的錯誤,它提供給我們這麼多的信息,我們不必記住每一件事。 – ethicallogics

+0

@ethicallogics:你能否編輯你的答案來給出正確的遺產計劃?(我刪除這個評論一旦你完成了) – GameAlchemist

1

您無法爲Rectangle定義控件模板,因爲它不是控件,而是Shape。您只能爲從Control派生的類定義控件模板。

0

您應該
1)使用Style(而不是ControlTemplate)具有四捨五入的邊界。
2)在你的風格中使用Trigger

下面的XAML應該讓你從你的目標越來越近:

<Style x:Key="MyRectangleStyle" TargetType="{x:Type Rectangle}"> 
     <Setter Property="SnapsToDevicePixels" Value="true"/> 
     <Setter Property="OverridesDefaultStyle" Value="true"/> 
     <Setter Property="MinHeight" Value="23"/> 
     <Setter Property="MinWidth" Value="75"/> 
     <Setter Property="Fill" Value="Blue"/> 

     <Setter Property="RadiusX" Value="2" /> 
     <Setter Property="RadiusY" Value="2" /> 

    <Style.Triggers> 
    <DataTrigger Binding="{Binding DirectLineState}" 
         Value="{x:Static l:DLS.Available}"> 
     <Setter Property="Fill" Value="Gold"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding DirectLineState}" 
         Value="{x:Static l:DLS.Idle}" > 
     <Setter Property="Fill" Value="Silver"/> 
    </DataTrigger > 
    <DataTrigger Binding="{Binding DirectLineState}"        
         Value="{x:Static l:DLS.Available}"> 
     <Setter Property="Fill" Value="Green"/> 
    </DataTrigger > 
    <DataTrigger Binding="{Binding DirectLineState}" 
         Value="{x:Static l:DLS.Called}"> 
     <Setter Property="Fill" Value="LightBlue"/> 
    </DataTrigger > 
    </Style.Triggers> 
</Style> 

(注意:
1)我改變了 「MyRectangleStyle」 的關鍵。
2)如果你想要這個Style成爲默認Style,不給它一個Key,而只是一個TargetType ...
3)...或設置Key"{x:Type Rectangle}"。 msdn似乎更喜歡這種方式。
btw:你不應該在公共屬性而不是觸發器上使用DataTriggers嗎?但我不知道你的應用程序的整個架構。 )

Rq:對於上面的代碼工作,您需要:
1)一個名爲DirectLineState的公共知識提高NotifyPropertyChanged的變化。
2)一個enum被稱爲DLS定義在您的項目中的單獨文件(如類)
3)您需要「l」作爲您的項目名稱空間。

 <xmlns:l="clr-namespace:MyProjectNameSpace" > 

4)分配Style和用於Rectangle

+0

感謝您的回覆。我試過你的方法,並且基於初始狀態在啓動時設置了正確的背景顏色。但是,當將關聯值更改爲組件的「狀態」依賴項屬性時,背景顏色保持不變(即,它不會更新)。在我看來,我錯過了這裏的最後一步,有什麼想法? – Nacho1984

+0

1)你必須檢查DataContext是否正確。爲了確保你的測試只給你的矩形一個名字,並在窗口構造函數中分配DataContext。 2)正如我所說我不明白你的按鈕模板如何工作:你應該使用DataTrigers。我更新了我的答案,因爲它現在是有效的(我測試過)。 – GameAlchemist

+0

它是如此工作或讓你解決? – GameAlchemist

相關問題