2016-11-10 4 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プロパティと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)); 
     } 
    } 
} 

グリッドのSizeChangedにイベントハンドラを登録した後

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は更新をポストしません。 ElementNameバインディングのバインディングソースとしてActualWidthを使用しないでください。 ActualWidthに基づいて更新が必要なシナリオがある場合は、SizeChangedハンドラを使用します。

SizeChangedイベントを購読するなどして、ウィンドウのサイズを判断する別の方法が必要になります。

+0

の後ろにあなたのコードMainPage.xaml.csでは新しいサイズを正しく更新できました。私はコーディングの初心者ですが、SizeChangedのグリッドにイベントハンドラを登録しながら、MVVMパターンを尊重する方法はありますか? –

関連する問題