Назначьте значение свойства вне файла ресурсов stati c - PullRequest
1 голос
/ 29 мая 2020

Не знаю, правильно ли я сформулировал вопрос, но вот моя проблема. У меня на экране 3 кнопки. Каждая кнопка использует один и тот же MyButtonStyle из файла ресурсов stati c. Все 3 кнопки работают одинаково, но я хочу, чтобы граница каждой из них имела различное свойство CornerRadius. Поскольку сама кнопка не имеет свойства CornerRadius, я не могу использовать TemplateBinding, как это было для фона и кистей. Я мог бы расширить базовый стиль, чтобы создать 3 отдельных стиля, но я хотел попробовать сделать это таким образом.
Вот мой код:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Name="border" 
                        BorderThickness="2" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        Background="{TemplateBinding Background}" 
                        CornerRadius = something >

                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

Итак, вопрос в том, что именно я должен указать как значение CornerRadius, чтобы иметь возможность изменять его отдельно для каждого объекта, из кода или файла XAML окна?
Я стремился к чему-то вроде этого, хотя не уверен, выполнимо ли это:

<Button x:Name="Button1"
        Width="240"
        Height="150"
        Style="{StaticResource MyButtonStyle}"
        BoundNameForCornerRadius="10"/>

1 Ответ

1 голос
/ 29 мая 2020

Если вы не используете свойство Tag для других целей, вы можете найти свой путь с помощью простого решения, привязав CornerRadius в стиле к свойству Tag кнопки:

        <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" 
                            BorderThickness="2" 
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            Background="{TemplateBinding Background}" 
                            CornerRadius = "{Binding Path=Tag,
    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}}" >

                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Button x:Name="Button1"
                    Width="240"
                    Height="150"
                    Style="{StaticResource MyButtonStyle}"
                    Tag="10"/>   <!-- set CornerRadius to 10-->

        <Button x:Name="Button2"
                    Width="240"
                    Height="150"
                    Style="{StaticResource MyButtonStyle}"
                    Tag="30"/> <!-- set CornerRadius to 30-->

Я допускаю, что это решение не помогает сделать код / ​​стиль более понятным / читаемым, но оно простое и делает работу выполненной.

...