web-dev-qa-db-ja.com

WPFユーザーコントロールをウィンドウに合わせて幅を広げる方法は?

ユーザーコントロールのあるウィンドウがあり、ユーザーコントロールの幅をウィンドウの幅に等しくしたいと思います。どうやってするか?

ユーザーコントロールは水平メニューであり、3列のグリッドが含まれています。

<ColumnDefinition Name="LeftSideMenu" Width="433"/>
<ColumnDefinition Name="Middle" Width="*"/>
<ColumnDefinition Name="RightSideMenu" Width="90"/>

それが、2番目の列が相対的な状態で、ユーザーコントロールを100%の幅に拡大するために、ウィンドウの幅が必要な理由です。

編集:

私はグリッドを使用しています、ウィンドウのコードがあります:

<Window x:Class="TCI.Indexer.UI.Operacao"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles"
    Title=" " MinHeight="550" MinWidth="675" Loaded="Load" ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" Focusable="True"
    x:Name="windowOperacao">
    <Canvas x:Name="canv">
        <Grid>
            <tci:Status x:Name="ucStatus"/> <!-- the control which I want to stretch in width -->
        </Grid>
    </Canvas>
</Window>
42

ユーザーコントロールの幅がユーザーコントロールのxamlファイルで設定されていないことを確認する必要があります。そこからWidth = "..."を削除するだけで準備完了です!

編集:これは私がテストしたコードです:

SOUserAnswerTest.xaml:

<UserControl x:Class="WpfApplication1.SOAnswerTest"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Height="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Name="LeftSideMenu" Width="100"/>
            <ColumnDefinition Name="Middle" Width="*"/>
            <ColumnDefinition Name="RightSideMenu" Width="90"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0">a</TextBlock>
        <TextBlock Grid.Column="1">b</TextBlock>
        <TextBlock Grid.Column="2">c</TextBlock>
    </Grid>
</UserControl>

Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="415">
    <Grid>

        <local:SOAnswerTest Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2"/>
    </Grid>
</Window>
43
Arjan Einbu

WPFのCanvasは、多くの自動レイアウトサポートを提供しません。私はこの理由でそれらを避けようとします(Horizo​​ntalAlignmentとVerticalAlignmentは期待どおりに機能しません)が、これらの小さな変更(キャンバスのActualWidth/ActualHeightにコントロールの幅と高さをバインド)で動作するようにコードを取得しました。

<Window x:Class="TCI.Indexer.UI.Operacao"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles"
Title=" " MinHeight="550" MinWidth="675" Loaded="Load" 
ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" 
WindowState="Maximized" Focusable="True" x:Name="windowOperacao">

<Canvas x:Name="canv">
    <Grid>
        <tci:Status x:Name="ucStatus" Width="{Binding ElementName=canv
                                                    , Path=ActualWidth}" 
                                      Height="{Binding ElementName=canv
                                                    , Path=ActualHeight}"/> 
        <!-- the control which I want to stretch in width -->
    </Grid>
</Canvas>

ここでキャンバスが問題です。レイアウトやZオーダーの「押しつぶし」の観点からキャンバスが提供する機能を実際に利用していない場合(PhotoShopのflattenコマンドのことを考えてください)、代わりにグリッドのようなコントロールを使用することを検討します。 WPFで期待するようになったものとは異なる動作をするコントロールの癖を学ぶ必要があります。

21
Michael

キャンバスはウィンドウ内で重要ですか?そうでない場合は、削除して、グリッドをメインパネルのままにしてください。キャンバスは、指定しない限りサイズがありませんが、通常、グリッドは使用可能なすべてのスペースを占有します。キャンバス内では、グリッドに使用可能なスペースがありません。

7
Bubblewrap

ユーザーコントロールでHorizo​​ntalAlignmentをStretchに設定し、WidthをAutoに設定すると、目的の結果が得られますか?

2

代わりに、ユーザーコントロールでWidthとHeightを使用し、MinHeightとMinWidthを使用します。その後、UCを適切に構成し、他のウィンドウ内に拡大することができます。

WPFで見たように、MicrosoftはWindowsのプロパティと動作について再考しましたが、これまでのところ、古いウィンドウフォームから何も見逃していませんでした。WPFにはコントロールがありますが、新しい視点で。

1

これは私のために働いた。 UserControlに幅や高さを割り当てたり、親ウィンドウで行と列の定義を定義したりしないでください。

<UserControl x:Class="MySampleApp.myUC"
         xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.Microsoft.com/expression/blend/2008" 
         mc:Ignorable="d"  
        >
   <Grid>

    </Grid>
</UserControl>


 <Window xmlns:MySampleApp="clr-namespace:MySampleApp"  x:Class="MySampleApp.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="auto" Width="auto" MinWidth="1000" >
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />           
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />            
    </Grid.ColumnDefinitions>
    <MySampleApp:myUC Grid.Column="0" Grid.Row="0" />       
</Grid>
1
Shahid

UserControlを追加するコンテナは何ですか?一般に、コントロールをグリッドに追加すると、コントロールは使用可能なスペースを埋めるために伸縮します(行/列が特定の幅に制限されていない限り)。

1
Andy