为WPF CustomControl

时间:2018-08-15 21:35:05

标签: c# wpf custom-controls controltemplate

我已经设计了一些WPF CustomControl,并为它们编写了ControlTemplate,然后我通过样式将ControlTemplates分配给了这些控件:

例如:

 public class BootstrapText : TextBox
 {
     protected override void OnLostFocus(RoutedEventArgs e)
     {
          // ...
     }

     protected override void OnTextChanged(TextChangedEventArgs e)
     {
         // ...
         base.OnTextChanged(e);
     }

     public static readonly DependencyProperty RegexProperty = DependencyProperty.Register("Regex", typeof(string), typeof(BootstrapText), new PropertyMetadata(null));

     public bool IsValid
     {
        // ...
     }

     public string Regex
     {
       // ...          
     }

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

和ControlTemplate(实际上是样式)类似:

 <Style TargetType="Controls:BootstrapText" BasedOn="{StaticResource FontBase}">
     <Setter Property="Padding" Value="2"/>
     <Setter Property="Width" Value="240"/>
     <Setter Property="SnapsToDevicePixels" Value="True"></Setter>
     <Setter Property="Background" Value="#FEFEFE"/>
     <!--<Setter Property="VerticalContentAlignment" Value="Center"/>-->
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="Controls:BootstrapText">
                 <Grid>
                     <Border Name="container" HorizontalAlignment="Left" Padding="{TemplateBinding Padding}" Height="{TemplateBinding Height}" BorderThickness="1" BorderBrush="#ccc" Background="{TemplateBinding Background}">
                         <ScrollViewer Padding="0" x:Name="PART_ContentHost" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" TextBlock.TextAlignment="Center" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                     </Border>

虽然我没有x:Key="SomeKey"样式。这种风格会影响所有BootstrapText

这很好。但是我还有另一个问题。我想在窗体中的某个地方设置这些控件的样式,并为其设置一些边距和填充,但保留默认设置。但我的控制权将消失!!!

我认为两次样式都会隐藏默认样式。 在TextBoxButton等标准控件中,只要我们编写某种样式,一切都很好,而样式只需设置我们的属性即可。

我认为,我必须直接将ControlTemplate分配给CustomControl,因为我必须掌握这种样式化过程。但我不知道怎么办?

1 个答案:

答案 0 :(得分:1)

控件的默认Style应该在称为ResourceDictionary的{​​{1}}中定义,并且该generic.xaml应该位于文件夹ResourceDictionary的文件夹中。默认情况下在其中定义控件的程序集的根。

这些名称是按照惯例的,因此只需将您的Themes移至Style