问题描述
我有一些 x:bind 方法,可以根据主机控件的大小设置元素大小。除了将函数绑定到我的用户控件中的 Margin 属性(来自样式字典)之外,一切都运行良好,我收到 System.AccessViolationException。
如果直接绑定到元素,我不会收到异常 - 仅在样式设置器中使用时。显然可以通过在对象的 xaml 上设置属性来解决这个问题,但想知道这是一个错误还是我遗漏了什么?字典中的函数绑定适用于我正在使用的所有其他属性(只是不在 Margin 上)。任何建议或指导将不胜感激。
XAML 代码段:
<UserControl.Resources>
<ResourceDictionary>
<Style targettype="Path" x:Key="Ball.Shadow">
<Setter Property="Height" Value="{x:Bind DimensionAsFraction(0.5)}" />
...
</Style>
<Style targettype="TextBlock" x:Key="Ball.Letter" BasedOn="{StaticResource Ball.Text}">
<Setter Property="Margin" Value="{x:Bind MarginAsFraction(0.075),Mode=OneWay}" />
...
</style>
object.Height 是宿主控件的高度 - 已设置 在组件初始化并在引用时正常工作之前 来自其他代码和样式设置器。
代码片段:
public sealed partial class Example : UserControl
{
private void SetDefaults()
{
Height = 200;
Width = 200;
}
private int calculateAsInt(double fraction) => (int)(object.Height * fraction);
private double DimensionAsFraction(double fraction) => calculateAsInt(fraction);
private Thickness MarginAsFraction(double fraction) => new Thickness(0,calculateAsInt(fraction),0);
private Thickness BorderAsFraction(double fraction) => new Thickness(calculateAsInt(fraction));
public Example()
{
SetDefaults();
this.InitializeComponent();
}
}
谢谢:D
解决方法
UWP 样式 X:将边距绑定到函数会引发 System.AccessViolationException。任何想法为什么,如果在内联 xaml 中设置它可以正常工作?
恐怕你不能在样式设置器中使用绑定或 x:bind,派生自 official document
Windows Presentation Foundation (WPF) 和 Microsoft Silverlight 支持使用绑定表达式为样式中的 Setter 提供值的能力。 Windows 运行时不支持 Setter.Value 的 Binding 用法(不会评估 Binding 并且 Setter 无效,您不会收到错误,但也不会获得所需的结果)。从 Windows Presentation Foundation (WPF) 或 Microsoft Silverlight XAML 转换 XAML 样式时,将任何绑定表达式用法替换为设置值的字符串或对象,或将值重构为共享的 {StaticResource} 标记扩展值,而不是绑定获得的值。
对于这种情况,我们建议直接在控件中设置边距
<TextBlock Text="Hello World" Margin="{x:Bind MarginAsFraction(0.75)}" />