2009-12-16 78 views
1

我有很多XAML代碼,並希望在利用WPF 4.0功能的同時保持與WPF 3.0的兼容性。例如,如果可用,我想使用UseLayoutRounding。當然,我可以在C#中做到這一點:如何在XAML中使用ifdefs

void SetProperty(..) 
{ 
    #if WPF4 
    set property 
    #endif 
} 

有沒有完成在XAML同樣的事情優雅的方式?

+4

是否http://stackoverflow.com/questions/1213576/xaml-conditional-compilation回答你的事題? – Qberticus 2009-12-16 23:35:16

回答

3

我想你可以用類擴展的MarkupExtension解決您的問題:

[MarkupExtensionReturnType(typeof(bool))] 
public class IsWPF4Extension : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
    #if WPF4 
     return true; 
    #endif 
     return false; 
    } 
} 

比XAML,你可以用它這樣的:

<MyControl UseLayoutRounding="{IsWPF4}"/> 
+0

偉大的解決方案,我喜歡這樣的語法 – 2009-12-17 01:40:04

+0

這並不能解決我的問題,因爲UseLayoutRounding沒有在WPF 3.0中定義 – 2009-12-17 01:41:20

+0

對不起,湯姆,我忘記了...... – CaptainPlanet 2009-12-17 12:27:04

0

如果你只是想使用「UseLayoutRounding」財產,你不需要。

由於默認情況下此值爲true,因此Microsoft不建議您將其關閉,也不建議您明確將其設置爲true。

+1

不是true:UseLayoutRounding默認設置爲false。 – 2009-12-17 01:42:54

1

我會以編程方式執行它,因爲這樣你不必觸摸你的xaml代碼。

調用此方法後,您初始化佈局根,並設置所有你在WPF需要4

public static void SetLayoutRounding(Visual visual) 
    { 
     if (visual is UIElement) 
      (visual as UIElement).SetValue(UseLayoutRoundingProperty, true); 

     for (var i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++) 
     { 
      var child = VisualTreeHelper.GetChild(visual, i); 
      if(child is Visual) 
       SetLayoutRounding((Visual)child); 
     } 
    }