2011-06-29 1 views
3

WindowのサイズのClientのサイズにWPFコントロール(この例ではGridコントロールを使用します)のサイズを変更できません。私はGridがデフォルトで利用可能なすべてのスペースを自動的に塗りつぶすことを認識していますが、のWidthを手動で設定して、別のコントロール(その列のWidthの1つを持つDataGridをStarに設定しますそれは何か違いがあります)。ウィンドウの「クライアントエリア」を塗りつぶすコンテンツのサイズを設定する

次のXAMLをご検討ください:

<Window x:Class="TestApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="768" Width="1024" 
     x:Name="mainWindow"> 

    <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"> 
     <Grid x:Name="testGrid" Background="DarkGray"> 
     </Grid> 
    </ScrollViewer> 

</Window> 

し、次のコードビハインド:

using System.Windows; 

namespace TestApplication 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      testGrid.Width = mainWindow.Width - (SystemParameters.BorderWidth * 2); 
     } 
    } 
} 

この単純なアプリケーションを実行する場合、GridClient面積よりやや大きい幅を有していますその結果、Horizontal Scroll Barが表示されます。 SystemParameters.BorderWidthWindowのボーダーの幅を正確に計算しない場合はどうなりますか?

最新のMSDNドキュメントのとおり、SystemParameters.BorderWidth最小化されていないウィンドウの非クライアント領域の境界線の幅を指定するメトリックを取得します。

答えて

1

かなりの時間このサイジングの問題で戦った後、私は最終的に問題の洗練された解決策を見つけました。私は@Rick Sladkeyの回答を答えとして選択しているにもかかわらず(私の質問に答えても)、私はそれが他の誰かを助けることを望んで私の更新された理解を投稿するかもしれないと思った。

本当の欲求不満の点は、それがScrollViewerを扱っていることが判明しました。 ScrollViewerActualWidthにコンテンツをサイジングすると、VerticalScrollBarが表示されていないときにうまく機能しましたが、内容が垂直方向にスクロール可能な高さに成長するとすぐに事態が悪化し始めました。 ActualWidthのバインディングは、ScrollViewerの可視領域内に収まるようにサイズを変更する予定でしたが、実際は同じ幅のままで、水平方向にもスクロール可能になりました。

実際には、修正は実際には非常に簡単でした。コントロールの高さまたは幅をそれぞれScrollViewerのまたはActualWidthにバインドするのではなく、コントロールの高さまたは幅をScrollViewerViewportHeightまたはにバインドします。

+0

+1、 'ScrollViewer'に役立ちます。残念ながら、['ViewportWidth'](http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter.viewportwidth%28v=vs.110%29.aspx)と[' ViewportHeight'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter.viewportheight%28v=vs.110%29.aspx)は['ScrollContentPresenter']の依存プロパティではないようです(http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter%28v=vs.110%29.aspx)。 –

-1

代わりにどのように代わり、グリッドのActualWidthプロパティへの結合については、手動で幅を設定するので

+1

これは私が達成しようとしているものでは機能しません。私が見つけた 'Grid'は、その要素に合わせて動的に展開されます。私は実際に 'Grid'内の要素が' Grid'よりも大きくならないようにしています。たとえば、 'DataGridTextColumn'の幅がStarに設定されている場合、それはContaining' Grid'も同様に成長します。 –

5

がここにはコード - とクライアントの幅の大きさを結合する一つの方法である(これはあなたの実際の値が得られます)後ろ:

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"> 
    <Grid x:Name="testGrid" Background="DarkGray" Width="{Binding Content.ActualWidth, ElementName=mainWindow}"> 
    </Grid> 
</ScrollViewer> 

これはあなたの名前のトップレベルWindowを使用していますし、それのコンテンツの実際の幅、この場合はScrollViewerとなります。なんらかの理由で、ウィンドウの内容をウィンドウと異なるサイズにしたい場合は、空のGridに囲むことができますので、この方法はまだ機能します。

+0

これはまさに私が探している機能です。今私はマージンに対処する方法を見つける必要があります。 –

関連する問題