web-dev-qa-db-ja.com

アンカー/ドックプロパティに相当するwpfでコントロールのサイズを変更する方法

私はこの問題について多くの解決策を読みました。それらのすべてが私の問題を解決できません。コントロールをどのコンテナに入れても、コントロール/コンテナにどのプロパティを設定しても、動きません。内部にコントロールを備えたスクロールビューアーがあります。ユーザーが実行時にウィンドウのサイズを変更するときに、ウィンドウに合わせてサイズを変更したい。必要なのは、anchor = top、bottom、left、rightです。 WPFでこれが非常に理解しにくい理由と、Formsで単一のプロパティを実現するためにコンテナオブジェクトとすべての種類のプロパティの割り当てが必要な理由がわかりません。ただし、この問題のすべての解決策は、実行時にウィンドウのサイズが変更されるため、コントロールが設計時のサイズのままになることを意味します。 WPFの動的制御のサイジングを把握する簡単な方法は何ですか?

29
Mike

これは私にも悲しみを引き起こし、AlexKは私が光を見るのを助けました。トリックは、高さと幅を設定しないことです。これらをAUTOに設定し、MARGINを使用してサイズを設定します。 HORIZONTALALIGNMENTおよびVERTICALALIGNMENTSTRETCHに設定すると、アンカー機能が機能します。

46
www.redware.com

コントロールを引き伸ばす必要があります。それだけです。

<MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

Stretchは、それぞれの両側にアンカーを設定することを置き換えます。

パネルのヘルプについては、 この概要 を参照してください。 レイアウトシステムのドキュメント も参照してください。

ほとんどのコントロールは自動的に伸縮します。DataGridがある場合は伸縮する必要があります。このサンプルを Kaxaml で試してください。DataGridとそのサイズを示すTextBlockが含まれています。

<Window xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid Name="grid">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
                <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/>
            </DataGrid.Columns>
            <FrameworkElement Name="Skeet" Tag="Programmer"/>
            <FrameworkElement Name="Gravell" Tag="Programmer"/>
            <FrameworkElement Name="Steve" Tag="Coffee Getter"/>
        </DataGrid>
        <TextBlock Grid.Row="1">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}, {1}">
                    <Binding ElementName="grid" Path="ActualWidth"/>
                    <Binding ElementName="grid" Path="ActualHeight"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>

ウィンドウのサイズを小さくすると、DataGridのScrollBarsが表示されます。

5
H.B.

サイズを変更しないコントロールがカスタムコントロールであると想定しています。

  • DockPanelをコンテナとして使用します。
  • コントロールから明示的なWidthおよびHeightプロパティを削除します。

VS2008で作業している場合、デザイナで表示するとコントロールが最小サイズに折りたたまれるため、不便が生じます。

Expressions BlendとVS2010以降は両方ともデザイナーの名前空間を尊重するため、デザイン時のみのコントロールサイズを指定できます。

そのために、コントロールに次を追加します。

<UserControl ...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008" 
    mc:Ignorable="d"
    d:DesignWidth="WWW" d:DesignHeight="HHH">
    ....
</UserControl>

d:DesignWidthおよびd:DesignHeightは、設計時間の幅と高さを指定します。

4
AlexK

この質問は古いですが、私がここにいるのを見つけたので、私は自分の解決策を捨てるだろうと思いました。以下のコードは、2つのタブを持つタブコントロール用で、各タブにはタブを埋めるためのコントロールが含まれています。明示的に設定された幅と高さを削除し、サイズを変更するすべてのコントロールで水平および垂直の配置を自動に設定しました。タブコントロールは、メインウィンドウに沿って広がります。タブ内のコントロールが伸びて、タブがいっぱいになります。ここでの回答から情報が得られました。私は完全な例を挙げました。

これが誰かに役立つことを願っています。

        <TabControl HorizontalAlignment="Stretch" 
                Margin="91,0,0,0" Name="tabControl1"
                VerticalAlignment="Stretch" >
        <TabItem Header="DataGrid" Name="tabItem1">
            <Grid>
                <DataGrid AutoGenerateColumns="False" 
                          HorizontalAlignment="Stretch" 
                          Name="dgFTPLog"
                          VerticalAlignment="Stretch" 
                          Margin="6,6,0,0" />
            </Grid>
        </TabItem>
        <TabItem Header="Log" Name="tabItem2">
            <Grid>
                <TextBox 
                         HorizontalAlignment="Stretch" 
                         Margin="6,6,0,0" Name="txtLog"
                         VerticalAlignment="Stretch"
                         VerticalScrollBarVisibility="Auto" 
                         HorizontalScrollBarVisibility="Auto" 
                         TextChanged="txtLog_TextChanged" />
            </Grid>
        </TabItem>
    </TabControl>
1
Tony Heflin

私もこの問題に遭遇しました。親コントロールへのバインドの試行は、XAMLではなくコードビハインドを介して行う場合にのみ機能することを除いて、ActualHeightプロパティとActualWidthプロパティを制御します。

すなわちXAML

<MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged">
     <ChildControl x:name=childControl" />
</MyParentControl>

の中に .csコードビハインド

private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        childControl.Height = parentControl.ActualHeight;
        childControl.Width = parentControl.ActualWidth;
    }
0
Arash