2016-11-10 87 views
1

我想要綁定到文本塊的當前窗口大小。 在當前的實現中,主窗口的大小是在運行時設置的,但是如果在應用程序啓動之後調整窗口的大小,則新的大小在文本塊中不會更新。UWP - 將元素綁定到主窗口大小,並且隨着窗口大小的變化更新值

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

回答

0

在UWP,所述網格控件通常會自動調整以適應它的父容器中。然而

你的文本框有一組高度和寬度,這將阻止它,當它的父網格大小調整。

在您所描述的場景中,我實現了加入ScreenHeight和屏幕寬度屬性當屏幕尺寸改變時更新我的​​視圖模型一個解決方法。然後,你可以將你想調整大小的任何控件的高度/寬度綁定到這些特性。下面是一個簡單的實現:

您的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> 

您的視圖模型

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; 
} 
3

您不應該綁定到ActualWidth。在FrameworkElement.ActualWidth文檔的言論說:

雖然它有一個ActualWidthProperty支持字段,ActualWidth的不引發屬性更改通知,它應該作爲常規CLR屬性,而不是依賴項屬性被認爲。

有關的ElementName綁定的目的,當它改變ActualWidth的不發佈更新(由於它的異步和運行時間計算的本質)。不要嘗試使用ActualWidth作爲ElementName綁定的綁定源。如果您有一個需要基於ActualWidth更新的場景,請使用SizeChanged處理程序。

您需要一些其他方式來確定窗口的大小,例如通過訂閱SizeChanged事件。

+0

註冊事件處理程序到網格的SizeChanged將後在MainPage.xaml.cs中,我能夠正確更新新的大小。我是一個編程初學者,有沒有辦法仍然尊重MVVM模式,同時註冊一個事件處理程序到SizeChanged的網格? –