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 天前遇到了同样的问题,所以我希望它能解决。 :)
我正在编写 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.
第一个是 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 天前遇到了同样的问题,所以我希望它能解决。 :)