我有很多XAML代碼,並希望在利用WPF 4.0功能的同時保持與WPF 3.0的兼容性。例如,如果可用,我想使用UseLayoutRounding
。當然,我可以在C#中做到這一點:如何在XAML中使用ifdefs
void SetProperty(..)
{
#if WPF4
set property
#endif
}
有沒有完成在XAML同樣的事情優雅的方式?
我有很多XAML代碼,並希望在利用WPF 4.0功能的同時保持與WPF 3.0的兼容性。例如,如果可用,我想使用UseLayoutRounding
。當然,我可以在C#中做到這一點:如何在XAML中使用ifdefs
void SetProperty(..)
{
#if WPF4
set property
#endif
}
有沒有完成在XAML同樣的事情優雅的方式?
我想你可以用類擴展的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}"/>
偉大的解決方案,我喜歡這樣的語法 – 2009-12-17 01:40:04
這並不能解決我的問題,因爲UseLayoutRounding沒有在WPF 3.0中定義 – 2009-12-17 01:41:20
對不起,湯姆,我忘記了...... – CaptainPlanet 2009-12-17 12:27:04
如果你只是想使用「UseLayoutRounding」財產,你不需要。
由於默認情況下此值爲true,因此Microsoft不建議您將其關閉,也不建議您明確將其設置爲true。
不是true:UseLayoutRounding默認設置爲false。 – 2009-12-17 01:42:54
我會以編程方式執行它,因爲這樣你不必觸摸你的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);
}
}
是否http://stackoverflow.com/questions/1213576/xaml-conditional-compilation回答你的事題? – Qberticus 2009-12-16 23:35:16