WPF如何通过控件模板访问属性(仅限XAML)
我有一个简单的xaml示例,我想更改CornerRadius属性,该属性是通过按钮的ControlTemplate设置的。我需要一个方法来改变它通过按钮。一个用例是:我有两个按钮,一个设置为“BigRadius”,另一个设置为“SmallRadius”。如果我更改边框上的默认值,则两个按钮的拐角半径相同。有没有办法只在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
<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还不能读懂你的心思:)。如果您不需要自定义按钮类,则可以使用附加属性。非常感谢您的快速回答。我打赌它会工作,但还有其他属性,例如边界笔刷或背景,我不需要更改。在这种方法中,我需要在两个地方重复我不需要更改的所有属性。除了使用依赖属性,还有其他方法吗?非常感谢您的快速回答。我打赌它会工作,但还有其他属性,例如边界笔刷或背景,我不需要更改。在这种方法中,我需要在两个地方重复我不需要更改的所有属性。是否有其他方法来实现这一点(除了使用依赖项属性)?