2017-02-15 17 views
2

我指的是代碼塊here,對數據觸發爲什麼樣式targettype必須重新綁定回原始屬性?

<Window x:Class="WpfTutorialSamples.Styles.StyleDataTriggerSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="StyleDataTriggerSample" Height="200" Width="200"> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <CheckBox Name="cbSample" Content="Hello, world?" /> 
     <TextBlock HorizontalAlignment="Center" Margin="0,20,0,0" FontSize="48"> 
      <TextBlock.Style> 
       <Style TargetType="TextBlock"> 
        <Setter Property="Text" Value="No" /> 
        <Setter Property="Foreground" Value="Red" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True"> 
          <Setter Property="Text" Value="Yes!" /> 
          <Setter Property="Foreground" Value="Green" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
    </StackPanel> 
</Window> 

對我來說,從編程語言設計點,線<Style TargetType="TextBlock">是完全沒有必要的,因爲它已經被嵌套在<TextBlock>裏面,這樣的當然,無論哪種設置屬性都應該應用於TextBlock類型。那麼爲什麼需要行<Style TargetType="TextBlock">

可以<Style TargetType>TextBlock之外的其他類型嗎?

回答

1

那麼爲什麼需要這條線呢?

甲樣式可以被定義爲一個資源,即不是內聯,並且如果沒有一個TargetType指定,XAML分析器應該如何能夠解析它並設置由制定者指定的屬性?它不能。或者至少它不。

僅僅因爲你可以定義Style直列你仍然創​​造了可用於作爲(全球)資源完全相同的類的實例,然後設置一個TargetType確實是必需的。

可以是除TextBlock以外的其他類型?

否,除了是從TextBlock派生的類型。如果指定另一種類型,則在分析BAML(編譯的XAML)時,將在運行時獲得異常。

2

你可以使用任何類TextBlock派生自(例如FrameworkElement)。

如果您實施自己的CustomizedTextBlock例如,您可以在項目中使用爲TextBlock定義的樣式。

你可以找到這個here的一個例子。

+0

*你可以使用任何類TextBlock派生自* ---什麼? – Graviton

+1

'class CustomizedTextBlock:TextBlock'可以使用'Style'與'TargetType =「TextBlock」'(例如...)。而'TextBlock'本身則來自'FrameworkElement'。所以你可以爲'TextBlock Style'使用'TargetType =「FrameworkElement」'。但我看不到爲簡單的「TextBlock」所做的努力...... – WPFGermany

相關問題