我想将文本块绑定到窗口的当前大小。 在当前实现中,主窗口的大小设置为运行时BUT如果我在应用程序启动后调整窗口大小,则在文本块中不更新新大小。
<Grid x:Name="grid" Background="#FFE8E8E8">
<TextBox x:Name="textBoxSample" Width="300" Height="200" Text="{Binding ActualWidth, ElementName=grid}"></TextBox>
</Grid>
答案 0 :(得分:3)
您不应该绑定到ActualWidth。 FrameworkElement.ActualWidth文档的评论说:
虽然它有一个ActualWidthProperty支持字段,但ActualWidth不会引发属性更改通知,它应该被视为常规CLR属性而不是依赖属性。
出于ElementName绑定的目的,ActualWidth在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。如果您的方案需要基于ActualWidth进行更新,请使用SizeChanged处理程序。
您需要一些其他方法来确定窗口的大小,例如通过订阅SizeChanged事件。
答案 1 :(得分:0)
在UWP中,Grid控件通常会自动调整大小以适合其父容器。
但是,您的文本框有一个设置的高度和宽度,这将防止它在调整其父网格大小时调整大小。
在您描述的场景中,我实现的一种解决方法是将ScreenHeight和ScreenWidth属性添加到我的视图模型中,这些属性在更改屏幕大小时会更新。然后,您可以将要调整大小的控件的高度/宽度绑定到这些属性。以下是一个示例实现:
您的XAML文件:
<Page x:Name="mainPage"
x:Class="YourApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:YourApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:YourApp.ViewModels"
SizeChanged="MainPage_SizeChanged">
<Page.DataContext>
<vm:ViewModel x:Name="dataContext"/>
</Page.DataContext>
<YourControl Height="{Binding ScreenHeight}" Width="{Binding ScreenWidth}"/>
</Page>
您的ViewModel
public class ViewModel: INotifyPropertyChanged
{
private double _screenWidth;
private double _screenHeight;
public double ScreenWidth { get { return _screenWidth; } set { _screenWidth = value; OnPropertyChanged("ScreenWidth"); } }
public double ScreenHeight { get { return _screenHeight; } set { _screenHeight = value; OnPropertyChanged("ScreenHeight"); } }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
你的守则背后
private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
{
dataContext.ScreenHeight = this.ActualHeight;
dataContext.ScreenWidth = this.ActualWidth;
}