UWP - 将元素绑定到主窗口大小,并在窗口大小更改时更新该值

时间:2016-11-10 10:27:23

标签: data-binding uwp

我想将文本块绑定到窗口的当前大小。 在当前实现中,主窗口的大小设置为运行时BUT如果我在应用程序启动后调整窗口大小,则在文本块中不更新新大小。

<Grid x:Name="grid" Background="#FFE8E8E8">
   <TextBox x:Name="textBoxSample" Width="300" Height="200" Text="{Binding ActualWidth, ElementName=grid}"></TextBox>
</Grid>

2 个答案:

答案 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;
}