Как получить доступ к элементу внутри стиля программно? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть стиль кнопки WPF ниже:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Width="{Binding Width}" Height="{Binding Height}">
                    <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}">
                        <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/>
                    </Border>
                    <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="overlay" Property="Opacity" Value="0.6" />
                        <Setter TargetName="overlay" Property="Background" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

Edit:

Я смешал предложения madd0 и Джоша и создал DataTrigger внутри моего стиля с привязкой к свойству, которое сообщает мне, должна ли кнопка иметь или не иметь рамку.

Финальный код ниже:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Width="{Binding Width}" Height="{Binding Height}">
                    <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}">
                        <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/>
                    </Border>
                    <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=HasBorder}" Value="true">
                        <Setter TargetName="container" Property="BorderThickness" Value="{Binding BorderThickness}" />
                        <Setter TargetName="container" Property="BorderBrush" Value="{Binding BorderBrush}" />
                    </DataTrigger>

                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="overlay" Property="Opacity" Value="0.6" />
                        <Setter TargetName="overlay" Property="Background" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Спасибо всем за помощь, Komyg

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Я думаю, что если вы расширите класс Button и дадите ему новое логическое значение DependencyProperty, по сути, все, что вам нужно сделать, это дать имя Border, а затем в ControlTemplate.Triggers, запустить это логическое свойство, чтобы создать нужную границу. это в ваших особых случаях.

Это будет похоже на то, что у вас уже есть с триггером IsPressed ControlTemplate.

0 голосов
/ 22 ноября 2011

Я не думаю, что вам действительно понадобится доступ к свойствам вашего шаблона элемента управления. Поскольку Button уже имеет свойства границ, вам нужно просто установить эти свойства для кнопки напрямую. Затем добавьте границу к вашему ControlTemplate, привязав его свойства к свойствам кнопки.

...