如何基于继承的样式创建样式
How to base a style on an inherited style
所以我有一个 Master Detail 页面。在我的母版页中,我有一个样式可以为所有按钮设置样式。
主页
<Style TargetType="Button">
<Setter Property="Background" Value="White" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="RenderTransformOrigin" Value="-0.893,-11.7"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
在我的详细信息页面中,我有一个按钮,我想通过样式向其中添加一些触发器
<Button Content="{Binding DeleteMultipleButton}" Margin="0,0,5,0" CommandParameter="{Binding ElementName=files, Path=SelectedItems}" Command="{Binding DeleteMultipleFiles}">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Deleting}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
但这会覆盖继承的样式,我会丢失按钮样式。有没有办法让我的按钮样式基于继承的样式? (我不能通过静态资源和密钥来做到这一点,因为资源在不同的页面中)
您可以使用 BasedOn 属性:
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
保持基本按钮样式不变:
<Style TargetType="Button">
<Setter Property="Background" Value="White" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="RenderTransformOrigin" Value="-0.893,-11.7"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
并将 BasedOn 属性 应用于详细信息页面上的按钮:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
...
</Style>
</Button.Style>
</Button>
所以因为这两种样式在不同的页面上,所以不可能从默认样式继承所以我所做的是用我的样式构建一个 App.xaml 资源文件,然后在两个页面上添加代码:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resource.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
给我的 xaml。这意味着我的页面随后可以使用 Mike Eason
的代码覆盖继承的样式:
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
所以我有一个 Master Detail 页面。在我的母版页中,我有一个样式可以为所有按钮设置样式。
主页
<Style TargetType="Button">
<Setter Property="Background" Value="White" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="RenderTransformOrigin" Value="-0.893,-11.7"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
在我的详细信息页面中,我有一个按钮,我想通过样式向其中添加一些触发器
<Button Content="{Binding DeleteMultipleButton}" Margin="0,0,5,0" CommandParameter="{Binding ElementName=files, Path=SelectedItems}" Command="{Binding DeleteMultipleFiles}">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Deleting}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
但这会覆盖继承的样式,我会丢失按钮样式。有没有办法让我的按钮样式基于继承的样式? (我不能通过静态资源和密钥来做到这一点,因为资源在不同的页面中)
您可以使用 BasedOn 属性:
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
保持基本按钮样式不变:
<Style TargetType="Button">
<Setter Property="Background" Value="White" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="RenderTransformOrigin" Value="-0.893,-11.7"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
并将 BasedOn 属性 应用于详细信息页面上的按钮:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
...
</Style>
</Button.Style>
</Button>
所以因为这两种样式在不同的页面上,所以不可能从默认样式继承所以我所做的是用我的样式构建一个 App.xaml 资源文件,然后在两个页面上添加代码:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resource.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
给我的 xaml。这意味着我的页面随后可以使用 Mike Eason
的代码覆盖继承的样式:
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">