x:Bind 到 ActualWidth 似乎不起作用

x:Bind to ActualWidth does not appear to work

我正在编写 C# UWP。我有一个带有以下示例代码的 UserControl:

<UserControl
    x:Class="Sample.AllocPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="Sample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="Root"
    mc:Ignorable="d">
    <RelativePanel>
        <AutoSuggestBox
            Width="{Binding Mode=OneWay, Path=ActualWidth, ElementName=Root}"
            Margin="50,0,50,0"
            RelativePanel.AlignHorizontalCenterWithPanel="True"
            RelativePanel.AlignVerticalCenterWithPanel="True" />
    </RelativePanel>
</UserControl>

此代码有效。但是,我想使用较新的 x:Bind,所以我用 {x:Bind Mode=OneWay, Path=Root.ActualWidth} 替换了 {Binding Mode=OneWay, Path=ActualWidth, ElementName=Root}。现在由于某种原因,整个 AutoSuggestBox 都从屏幕上消失了,我假设它得到的宽度是 0.

为什么会发生这种情况,我该如何解决?

正如 Roy Li - MSFT 所说,您可能必须在 class (UserControl.xaml.cs) 中实现 INotifyPropertyChanged 接口。但在你这样做之前,你需要在 class.

中添加 2 个新的命名空间

第一个是 System.ComponentModel(获得对 INotifyPropertyChanged 的访问权限) 第二个是 System.Runtime.CompilerServices(获得对 CallerMemberNameAttribute 的访问权限)

所以你的 class 现在应该看起来像这样

public sealed partial class MyUserControl1 : UserControl,INotifyPropertyChanged 
{
    public MyUserControl1()
    {
        this.InitializeComponent();
    }                                                                                    
    //some your code

    public double _width;
    public double width
    {
        get
        {
            _width = ActualWidth;
            return _width;
            OnPropertyChanged();
        }
        set
        {                
            _width = value;
            OnPropertyChanged();
        }
    }

    public void OnPropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

你的Page.xaml像这样

<Grid>
    <RelativePanel>
        <AutoSuggestBox
        x:Name="AutoSuggestBox"
        Width="{x:Bind width, Mode=OneWay}"
        Margin="50,0,50,0"
        RelativePanel.AlignHorizontalCenterWithPanel="True"
        RelativePanel.AlignVerticalCenterWithPanel="True" />
    </RelativePanel>
</Grid>

我 2 天前遇到了同样的问题,所以我希望它能解决。 :)