XAML: Могу ли я получить «следующий элемент управления» в составной панели и привязать ее к свойству? - PullRequest
1 голос
/ 01 сентября 2011

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

<StackPanel Visibility="{Binding showOpCode}" Margin="0,2" Orientation="Horizontal" >
            <TextBlock Width="212" VerticalAlignment="Center">Operation Code:</TextBlock>
            <Polygon Width="29" Points="14,8 14,21 28,14.5" Fill="Gray" Stroke="DarkGray"/>
            <TextBox HorizontalContentAlignment="Right" 
                     Name="txtOpCode" VerticalAlignment="Bottom" Width="122" Text="0"
                     Style="{StaticResource normalTextBoxStyle}" />
        </StackPanel>

1 Ответ

1 голос
/ 01 сентября 2011

Было бы лучше создать собственный стиль TextBox, включающий полигон.Вы можете получить стили по умолчанию от здесь .

Просто возьмите стиль по умолчанию для TextBox и связанных ресурсов, затем добавьте свой многоугольник слева.

Что-то вроде:

<LinearGradientBrush x:Key="TextBoxBorder"
                     StartPoint="0,0"
                     EndPoint="0,20"
                     MappingMode="Absolute">
    <LinearGradientBrush.GradientStops>
        <GradientStop Color="#ABADB3"
                      Offset="0.05"/>
        <GradientStop Color="#E2E3EA"
                      Offset="0.07"/>
        <GradientStop Color="#E3E9EF"
                      Offset="1"/>
    </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

<Style x:Key="CustomTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Foreground"
            Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background"
            Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="BorderBrush"
            Value="{StaticResource TextBoxBorder}"/>
    <Setter Property="BorderThickness"
            Value="1"/>
    <Setter Property="Padding"
            Value="1"/>
    <Setter Property="AllowDrop"
            Value="true"/>
    <Setter Property="FocusVisualStyle"
            Value="{x:Null}"/>
    <Setter Property="ScrollViewer.PanningMode"
            Value="VerticalFirst"/>
    <Setter Property="Stylus.IsFlicksEnabled"
            Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBoxBase}">
                <DockPanel>
                    <Polygon x:Name="polygon" DockPanel.Dock="Left" Width="29" Points="14,8 14,21 28,14.5" Fill="Gray" Stroke="DarkGray"/>
                    <theme:ListBoxChrome x:Name="Bd"
                                          BorderThickness="{TemplateBinding BorderThickness}"
                                          BorderBrush="{TemplateBinding BorderBrush}"
                                          Background="{TemplateBinding Background}"
                                          RenderMouseOver="{TemplateBinding IsMouseOver}"
                                          RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"
                                          SnapsToDevicePixels="true">
                        <ScrollViewer x:Name="PART_ContentHost"
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </theme:ListBoxChrome>
                </DockPanel>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter TargetName="Bd"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsKeyboardFocusWithin"
                             Value="false">
                        <Setter TargetName="polygon"
                                Property="Visibility"
                                Value="Collapsed"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Где xmlns theme определяется как xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero".Вам нужно добавить ссылку на PresentationFramework.Aero.dll или изменить ее с ListBoxChrome на Border.

...