WPF如何通过控件模板访问属性(仅限XAML)

WPF如何通过控件模板访问属性(仅限XAML),wpf,xaml,templates,binding,Wpf,Xaml,Templates,Binding,我有一个简单的xaml示例,我想更改CornerRadius属性,该属性是通过按钮的ControlTemplate设置的。我需要一个方法来改变它通过按钮。一个用例是:我有两个按钮,一个设置为“BigRadius”,另一个设置为“SmallRadius”。如果我更改边框上的默认值,则两个按钮的拐角半径相同。有没有办法只在XAML中实现这一点 <Window x:Class="StyleDemo.MainWindow" xmlns="http://schemas.microso

我有一个简单的xaml示例,我想更改CornerRadius属性,该属性是通过按钮的ControlTemplate设置的。我需要一个方法来改变它通过按钮。一个用例是:我有两个按钮,一个设置为“BigRadius”,另一个设置为“SmallRadius”。如果我更改边框上的默认值,则两个按钮的拐角半径相同。有没有办法只在XAML中实现这一点

<Window x:Class="StyleDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border  CornerRadius="5"  BorderBrush="Blue" 
                                BorderThickness="5" 
                                Width="80"
                                Height="40"                               
                                x:Name="BaseBorder">
                          <ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style TargetType="Grid" x:Name="GridWithMarginStyle">
            <Setter Property="Margin" Value="12"></Setter>
        </Style>

    </Window.Resources>
    <StackPanel>
        <!--This button will have a big corner radius-->
        <Button Name="Ok" Content="Ok"></Button>

        <!--This button will have a small corner radius-->
        <Button Name="CancelBtn" Click="CancelBtn_Click">Cancel</Button>
    </StackPanel>

</Window>

取消

您需要两种样式的按钮来实现您正在做的事情,或者创建一个自定义按钮来实现CornerRadius作为DependencyProperty,并将其与ControlTemplate中的CornerRadius of Border绑定

<Style TargetType="Button" x:Key="LargeRadiusStyle">
            <Setter Property="Background" Value="White" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border CornerRadius="10" Background="White" BorderBrush="Black" BorderThickness="1" >
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="Button" x:Key="SmallRadiusStyle">
            <Setter Property="Background" Value="White" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border CornerRadius="3" Background="White" BorderBrush="Black" BorderThickness="1" >
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
         </Style>

您需要两种样式的按钮来实现您正在做的事情,或者创建一个自定义按钮来实现CornerRadius作为DependencyProperty,并将其与ControlTemplate中的CornerRadius of Border绑定

<Style TargetType="Button" x:Key="LargeRadiusStyle">
            <Setter Property="Background" Value="White" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border CornerRadius="10" Background="White" BorderBrush="Black" BorderThickness="1" >
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="Button" x:Key="SmallRadiusStyle">
            <Setter Property="Background" Value="White" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border CornerRadius="3" Background="White" BorderBrush="Black" BorderThickness="1" >
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
         </Style>


不确定您对DPs有何异议。你需要一些东西来告诉按钮你想要大半径还是小半径。WPF还不能读懂你的心思:)。如果不需要自定义按钮类,则可以使用附加属性。

不确定针对DPs的内容。你需要一些东西来告诉按钮你想要大半径还是小半径。WPF还不能读懂你的心思:)。如果您不需要自定义按钮类,则可以使用附加属性。

非常感谢您的快速回答。我打赌它会工作,但还有其他属性,例如边界笔刷或背景,我不需要更改。在这种方法中,我需要在两个地方重复我不需要更改的所有属性。除了使用依赖属性,还有其他方法吗?非常感谢您的快速回答。我打赌它会工作,但还有其他属性,例如边界笔刷或背景,我不需要更改。在这种方法中,我需要在两个地方重复我不需要更改的所有属性。是否有其他方法来实现这一点(除了使用依赖项属性)?