2013-09-05 233 views
17

的RowDefinition身高在我的WPF風格我已經定義了一個標準的網格行高度我想申請到好幾個地方,像這樣:設置從靜態資源

<system:Double x:Key="TableRowHeight">22</system:Double> 

然而,當我想這是行不通的應用此像這樣:

<RowDefinition Height="{StaticResource TableRowHeight}"/> 

相反,我需要建立一個完整的風格,如:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}"> 
    <!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>--> 
    <Setter Property="Height" Value="22"/> 
</Style> 

可以看出從註釋行中嘗試引用Style定義中的數字常量也不起作用,但「硬編碼」值確實有效。

現在,我看着它,我想這是因爲隨着高度屬性相關聯的類型是GridLength,它並不會自動管理,自動施放從另一個正在添加資源時,雙值...

問題是,似乎沒有從XAML創建GridLength對象的方法。價值邏輯是隻讀的。因此,像這樣無法正常工作或:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}"> 
    <Setter Property="Height"> 
     <Setter.Value> 
      <GridLength Value="{StaticResource TableRowHeight}"/> 
     </Setter.Value> 
    </Setter> 
</Style> 

有沒有辦法得到這個工作,或者我應該忘記使用恆定的,只是使用的RowDefinition風格的硬編碼值不是恆定的?

回答

23

當你「硬編碼」的價值觀,在XAML處理器查找,可以從字符串轉換它必要的類型轉換器。即使您的TableRowHeight資源正在使用DoubleConverter來創建。 GridLength使用GridLengthConverter

因此,在編譯器中沒有自動轉換/轉換髮生 - WPF需要顯式查找類並調用轉換方法。在StaticResource的情況下,它跳過這一步。

綁定確實使用了類型轉換器的,所以下面工作,你希望:

<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" /> 

這工作,因爲GridLengthConverter知道如何從Double轉換。就你而言,這不應該是必要的,但。如果您在您初始化Double(標籤內)以同樣的方式初始化GridLength資源,分配資源之前字符串轉換將被稱爲:

<GridLength x:Key="TableRowHeight">22</GridLength> 

然後你就可以直接調用資源。

+0

使用'{Binding Source = ...}'語法的建議可行!謝謝! – bjavor

+0

按照上面建議的和其他響應中的定義GridLength的方式也適用,但是具有與必須使用硬編碼值定義整個RowDefinition樣式相同的缺點...您無法將值鏈接到系統:double資源。 (至少我還沒有找到一種方法來引用標籤內的另一個資源...)並沒有「價值」屬性暴露在GridLength ... – bjavor

+0

編輯:我堅持的原因鏈接到雙重值,因爲我可能需要在其他上下文中重用該值,而不需要GridLength或其他專用資源...... – bjavor

2

你將不得不以應用爲RowDefinition.Height創建GridLength類型的資源是GridLength類型:

<window:GridLength x:Key="TableRowHeight">50</window:GridLength> 

這將在工作無論如何要應用它。

3

試試這個:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     xmlns:t="clr-namespace:System.Windows;assembly=PresentationFramework"> 
    <Window.Resources> 
     <t:GridLength x:Key="gridHeight">50</t:GridLength> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="{StaticResource gridHeight}"></RowDefinition> 
     </Grid.RowDefinitions> 
    ....