Generic.xaml для текстового поля с прямоугольником, вертикально уложенным поверх него? - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь написать шаблон для моего элемента управления, SuperTextB, который устанавливает прямоугольник по всей области TextBox элемента управления.Этот прямоугольник будет использоваться для отображения сообщений об ошибках проверки при сбое проверки и будет скрыт в остальное время.То, что я пытался сделать, следует, но это не сработало.

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SuperTB">
<Style TargetType="{x:Type local:SuperTextB}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:SuperTextB}">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <Canvas x:Name="painting" Background="Red"
                            Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}" 
                                 Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}">
                        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" x:Name="PART_input"
                                 Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Canvas, AncestorLevel=1}, Path=Height}" 
                                 Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Canvas, AncestorLevel=1}, Path=Width}" 
                                 Canvas.ZIndex="1"/>
                        <Rectangle x:Name="PART_error"
                                 Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Canvas, AncestorLevel=1}, Path=Height}" 
                                 Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Canvas, AncestorLevel=1}, Path=Width}" 
                                 Canvas.ZIndex="2"/>
                    </Canvas>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 Ответ

1 голос
/ 08 июля 2011

Вам не нужны все эти привязки по ширине и высоте.Замените Canvas на Grid, затем установите ваши TextBox и Rectangle в качестве дочерних элементов Grid в этом порядке.ZIndex автоматически сделает прямоугольник сверху.Установите для фона Прямоугольник значение null или установите для него значение Hidden, пока вы не будете готовы отобразить его.Так, например:

<Style TargetType="{x:Type local:SuperTextB}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:SuperTextB}">
                <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid x:Name="painting" Background="Red">
                        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" x:Name="PART_input"/>
                        <Rectangle x:Name="PART_error" Visibility="Hidden"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...