UWP 样式 X:将边距绑定到函数会引发 System.AccessViolationException任何想法为什么,如果在内联 xaml 中设置它可以正常工作?

问题描述

我有一些 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)}" />