0

これは、WPFコントロールの配置に関する奇妙な動作です。私は以下のコントロールを持っていて、設計時にうまく調整されました。ただし、ランタイムにより、ボタンの隅に位置がずれていました

<Window x:Class="StackOverflow.LookAndWork"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Tables" Height="388" Width="314" ResizeMode="NoResize" >
    <Grid>
        <TextBox Margin="12,12,12,41"></TextBox>
        <Button Content="OK" Height="23" Margin="205,314,12,12" Name="button3" Width="75" IsCancel="True"  IsEnabled="False" />

    </Grid>
</Window>

DesignTimeスナップ

設計時間

ランタイムスナップ

ランタイム

ウィンドウからResizeMode="NoResize"を削除したとします。実行時に正しい位置を確認できます。ResizeMode = "NoResize"の問題は何ですか?

Anyhelpは大歓迎です!!!

4

4 に答える 4

2

見栄えを良くするために、マージンやサイズは使用しないでください。グリッド定義を使用して、アプリケーションを分割します。

次のxamlを使用すると、アプリケーションは常に見栄えが良くなります。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="23" />
    </Grid.RowDefinitions>
    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="75" />
        </Grid.ColumnDefinitions>
        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" />
    </Grid>
</Grid>

幅と高さは辞書で定義できます。この場合、RowDefinitionプロパティとColumnDefinitionプロパティで、値の代わりにAutoを使用します。

編集:次 のような辞書を使用する

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Button}">
        <Setter Property="Width" Value="75"/>
        <Setter Property="Height" Value="23"/>
    </Style>
</ResourceDictionary>

それから

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" />
    </Grid>
</Grid>
于 2013-03-13T11:01:47.457 に答える
2

コントロールレベルにマージンを追加する代わりに、グリッドレベルに最小マージンを追加してみませんか?

例:

<Grid Margin="12,12,12,12">

このようにして、12ピクセルのマージン境界を取得します。ボタンでは、ハードコードされた左マージンを実行しないでください。代わりに、あなたHorizontalAlignment="Right"は仕事をするために使うことができます。

ちなみに、Grid.RowDefinitions、Grid.ColumnDefinitions、Grid.Row、Grid.Columnを指定せずに、グリッドにコントロールを追加することはあまり好きではありません。これは、グリッド用の強力なツールです。

于 2013-03-13T11:03:53.370 に答える
1

VisualStudio 2012デザイナーで同じ問題を確認することはできません:http ://screencast.com/t/TGVgUyfR デザイン時とランタイムの両方が同じように見えます。したがって、以前のバージョンのデザイナにはバグがあるはずです。それでも、ボタンを別のグリッド行に移動するか、別のレイアウトコントロールを使用してビューを整理することをお勧めします。

于 2013-03-13T11:00:08.440 に答える
1

Xaruthの答えを拡張するために、ボタン行の高さを固定せず、代わりにデフォルトの高さを使用します。同じことが幅にも当てはまります。幅はボタンで定義します。

また、ボタンにマージンを与えることに注意してください。グリッドの列/行のサイズを固定しないという追加のボーナスは、行の高さもマージンを考慮に入れるようになりました。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" Width="75" Margin="0,8,0,0" />
    </Grid>
</Grid>
于 2013-03-13T11:07:07.303 に答える