我有很多 XAML 代码,并希望在利用 WPF 4.0 功能的同时保持与 WPF 3.0 的兼容性。UseLayoutRounding
例如,如果可用,我想使用它。当然,我可以在 C# 中做到这一点:
void SetProperty(..)
{
#if WPF4
set property
#endif
}
有没有一种优雅的方法可以在 XAML 中完成同样的事情?
我有很多 XAML 代码,并希望在利用 WPF 4.0 功能的同时保持与 WPF 3.0 的兼容性。UseLayoutRounding
例如,如果可用,我想使用它。当然,我可以在 C# 中做到这一点:
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}"/>
我会以编程方式进行,因为这样您就不必触摸您的 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);
}
}
如果您只想使用“UseLayoutRounding”属性,则不需要。
因为这个值默认为true,微软不建议你关闭它,也不建议你显式设置为true。