0

テキストボックスにはシンプルなスタイルがあります:

<Style x:Key="PortalFocusVisualStyle" TargetType="TextBox">
    <!--<Setter Property="Focusable" Value="False"/>-->
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#7FFFFFFF" Offset="1"/>
                <GradientStop Color="#3FFFFFFF"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Background">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#0CFFFFFF" Offset="0"/>
                <GradientStop Color="#26FFFFFF" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
</Style>

これは、すべてのテキストボックスがどのように見えるかです。ちなみに、可能であれば PasswordBoxes も同様ですが、同じ方法で新しいスタイルを作成することもできます。

ユーザーがテキスト ボックスをクリックすると、上部の境界線がほとんど消えて奇妙に見えます。Windows 7 では、これがデフォルトの動作のようです。しかし、私はこれを望んでいません。テキストボックス(またはパスワードボックス)は、フォーカスされているかどうかに関係なく、まったく同じように見えるはずです。

だから私の考えは、次のように style と focusvisualstyle の両方にこのスタイルを使用することでした:

私の問題は、フォーカスされたテキストボックスが同じように見えないことです。

私はビジュアルステートを操作しようとし、セッターにテンプレートを上記のスタイルに追加しました:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox" >
                <Grid x:Name="RootElement" Background="{TemplateBinding Background}" >
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused"/>
                            <VisualState x:Name="Unfocused"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
               </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

しかし、これはどういうわけか間違っています。空のボックスしか表示されません。グリッドに何を追加する必要があるのか​​ わかりません。または、グリッドが良いアイデアである場合、Visualstates をテンプレートにまったく追加できません。誰か助けてください。

それとももっと簡単な解決策がありますか?テキストボックスとパスワードボックスに、その背景と上からの境界線を備えた上記のスタイルを持たせたいのですが、フォーカスされているときは同じように見え、境界線などを変更しないでください...

どうもありがとう!エリック

4

1 に答える 1

0

これはあなたがする必要があることです:

<Style TargetType="{x:Type TextBox}">
        <Setter Property="Margin" Value="0" />
        <Setter Property="Padding" Value="0" />
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="BorderBrush">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#7FFFFFFF" Offset="1"/>
                    <GradientStop Color="#3FFFFFFF"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#0CFFFFFF" Offset="0"/>
                    <GradientStop Color="#26FFFFFF" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
                        <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Scrollviewer は、テキスト ボックス テンプレートの実際のコンテンツ ホストです。ここでの秘訣は、FocusVisualStyle を null に設定することです。これにより、すべてのプラットフォームで一貫した外観が得られます。

于 2012-08-27T16:02:55.120 に答える