我有很多XAML代码,并希望在利用WPF 4.0功能的同时保持与WPF 3.0兼容。例如,如果可用,我想使用UseLayoutRounding
。当然,我可以在C#中执行此操作:
void SetProperty(..)
{
#if WPF4
set property
#endif
}
在XAML中有没有一种优雅的方法来完成同样的事情?
答案 0 :(得分: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}"/>
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
如果您只想使用“UseLayoutRounding”属性,则不需要。
因为默认情况下此值为true,并且Microsoft不建议您将其关闭,并且也不建议您将其明确设置为true。