2010-03-05 66 views
5

我只是潛入WPF中,發現這對我的風格有點奇怪和令人沮喪:爲什麼某些東西的價值可能是一種資源,但您無法直接將該值設置爲該資源所代表的價值?例如:爲什麼我必須使用WPF中的「資源」?

這是有效的:

<ToggleButton> 
    <ToggleButton.Resources> 
     <Image x:Key="cancelImage" Source="cancel.png" /> 
    </ToggleButton.Resources> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content" Value="{DynamicResource cancelImage}" /> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

但是,這並不:

<ToggleButton> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content"> 
       <Setter.Value> 
        <Image Source="cancel.png" /> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

的區別是什麼?爲什麼不能同時工作?我不喜歡爲某些事情創建「資源」,因爲它會將我的代碼分開並使其更難以閱讀。

是的,我知道我的例子,可以簡化這樣

<ToggleButton> 
    <Image Source="cancel.png" /> 
</ToggleButton> 

但是這不是問題的關鍵。

+1

爲什麼這是一個Comminity Wiki? – AnthonyWJones 2010-03-05 16:28:43

+0

所以我發佈的任何錯誤信息都可以編輯。那是不正確的? – tyriker 2010-03-05 16:32:38

回答

3

使用setter時,setter的值必須支持「凍結」的能力。這可以是值類型(包括結構和枚舉),也可以是從Freezable派生的類。

它可能無助於您的審美意義,但在文件(或ResourceDictionary)的資源部分的頂部聲明所有資源通常更清晰,而不是將它們添加到單個樣式的資源或控制。

+0

這讓我絆了一會兒。一旦你意識到某些東西被凍結的性能好處,爲什麼MS強迫setter可以凍結的原因是有道理的。 – 2010-03-05 16:36:10

+0

所以你說通過製作資源,我凍結它?否則,我可能有機會在運行時更改的屬性,這是佈局/繪圖子系統的性能負擔。這是它的要點嗎? – tyriker 2010-03-05 21:55:15

+1

不,它沒有被凍結,StaticResource是凍結的setter中的元素。當模板的可視化樹被創建時,它可以找到非凍結的Image元素。由於Image不是來自Freezable,所以不能被凍結,所以不幸的是,這就是爲什麼你不能在setter中使用它。 – 2010-03-08 23:29:22

相關問題