3

これを例に取りましょう。これで、合計 8 つのテキスト ボックスができました。静的リソース スタイルを使用して、すべてがまったく同じスタイル セットを持つようにします。しかし、いくつかのテキストボックスには下の境界線があり、他のテキストボックスにはないことに注意してください. なぜこれが起こるのですか?

ここに画像の説明を入力 これがコードです

<Style x:Key="AddressTextBox" TargetType="TextBox">            
        <Setter Property="MinWidth" Value="230"></Setter>
        <Setter Property="MaxWidth" Value="260"></Setter>
        <Setter Property="MaxLength" Value="45"></Setter>
        <Setter Property="Margin" Value="1"></Setter>
        <Setter Property="BorderThickness" Value="1,1,1,1"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Padding" Value="1,2,0,1"/>
        <Setter Property="BorderBrush" Value="Gray"></Setter>
        <Setter Property="Height" Value="20"></Setter>
    </Style>

<DockPanel>
    <StackPanel>
        <Grid Margin="5">
            <StackPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7">Postal</TextBlock>
                        <TextBox Style="{StaticResource AddressTextBox}"></TextBox>                                            
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="10"></DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7">Street</TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
                <DockPanel Height="Auto">
                    <TextBlock Width="50" Margin="7"></TextBlock>
                    <TextBox Style="{StaticResource AddressTextBox}"></TextBox>
                </DockPanel>
            </StackPanel>
        </Grid>
    </StackPanel>
</DockPanel> 
4

1 に答える 1

1

あなたのレイアウトは非常に非効率的ですが、上記のすべてのコメントが示唆するように、それは問題ではありません. SnapToDevicePixelsPaddingMarginsなどとは関係ありませんTextBox'。コントロール スタイルの一部です。デフォルトより大きく設定するBorderWidthと隅々までくっつくようですが、それ以下にすると動かなくなります。のテンプレートを抽出するTextBoxと、その境界線とスタイルが表示されます。したがって、この不規則性を「打ち負かす」ためには、スタイルTextBoxBorderプロパティを間接的に操作する代わりに、そのテンプレートをオーバーライドする必要があります。次に、 でBorder直接操作しTemplateます。

動作するスタイルは次のとおりです(セッターをプラグインしました):

<SolidColorBrush x:Key="DisabledBackgroundBrush" Color="LightGray"/>
    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="Gray"/>
    <SolidColorBrush x:Key="EnabledBackgroundBrush" Color="White"/>

    <Style x:Key="AddressTextBox" TargetType="{x:Type TextBoxBase}">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="MinWidth" Value="230"/>
        <Setter Property="MaxWidth" Value="260"/>
        <Setter Property="Margin" Value="1"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Padding" Value="1,2,0,1"/>
        <Setter Property="Height" Value="20"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBoxBase}">
                    <Border Name="Border" CornerRadius="2"  Padding="2" Background="{StaticResource EnabledBackgroundBrush}" 
                            BorderBrush="Gray" BorderThickness="1" >
                        <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                            <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBackgroundBrush}"/>
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

また、レイアウトに関するヒントです。非効率性を最小限に抑えるために、次を使用しGridます。

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBlock Text="Postal"/>
        <TextBox Grid.Column="1" Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="1" />
        <TextBox Grid.Row="1" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="2" />
        <TextBox Grid.Row="2" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="3" />
        <TextBox Grid.Row="3" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="4" Text="Street" Margin="7,10,7,7"/>
        <TextBox Grid.Row="4" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="5"/>
        <TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="6"/>
        <TextBox Grid.Row="6" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>

        <TextBlock Grid.Row="7"/>
        <TextBox Grid.Row="7" Grid.Column="1"  Style="{StaticResource AddressTextBox}"/>
    </Grid>
于 2013-07-11T15:40:45.167 に答える