Pertanyaan Gaya Implisit tidak berfungsi pada Kontrol Kustom


Dalam App.xaml saya, saya memiliki beberapa gaya implisit

<Style TargetType="{x:Type Button}">
   ...Blah...
</Style>

Gaya ini berfungsi untuk kontrol selama tidak berada dalam kontrol kustom yang saya buat.

Kontrol saya

 public class NavigationControl : Control
 {
     public static readonly DependencyProperty ButtonStyleProperty =
         DependencyProperty.Register("ButtonStyle", typeof(Style), typeof(NavigationControl));

     public Style ButtonStyle
     {
         get { return (Style)GetValue(ButtonStyleProperty); }
         set { SetValue(ButtonStyleProperty, value); }
     }
 }

 static NavigationControl()
 {
     DefaultStyleKeyProperty.OverrideMetadata(typeof(NavigationControl), new FrameworkPropertyMetadata(typeof(NavigationControl)));
 }

 public NavigationControl()
 {
 }

Gaya Kontrol dan Template Saya

<ControlTemplate x:Key="NavigationControlTemplate" TargetType="{x:Type controls:NavigationControl}">
   <Button Style="{TemplateBinding ButtonStyle}"
</ControlTemplate>

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="MinWidth" Value="75"/>
    <Setter Property="Height" Value="50"/>
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Margin" Value="-1"/>
</Style>

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource DefaultButtonStyle}">
    <Setter Property="Template" Value="{StaticResource NavigationButtonTemplate}"/>
</Style>

<Style TargetType="{x:Type controls:NavigationControl}">
     <Setter Property="Template" Value="{StaticResource NavigationControlTemplate}"/>
     <Setter Property="ButtonStyle" Value="{StaticResource ButtonStyle}"/>
</Style>

Sekarang saya akan berasumsi bahwa BaseOn DefaultButtonStyle akan mendapatkannya dari level App. Tapi ternyata tidak. Satu-satunya cara untuk menerapkan gaya tingkat aplikasi Mengesampingkan ButtonStyle dengan menciptakan gaya tipe NavigasiControl.

Apakah ada cara di mana gaya implisit membuat ini berfungsi?


6
2017-08-23 21:25


asal


Jawaban:


Pengaturan BasedOn="{StaticResource {x:Type Button}}" Anda akan mendapatkan gaya tombol default WPF. Jika Anda ingin menggunakan gaya yang ditentukan di Anda App.xaml, Anda harus menambahkan kunci ke gaya itu sehingga Anda dapat merujuknya dari gaya kontrol Anda:

App.xaml

<!-- Your style, just with an added x:Key -->
<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
   ...
</Style>

<!-- Set the above style as a default style for all buttons -->
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource myButtonStyle}">

Gaya dan template kontrol Anda

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource myButtonStyle}">
    ...
</Style>

2
2017-08-23 21:33