代码之家  ›  专栏  ›  技术社区  ›  RezaNoei

为WPF CustomControl设置默认的ControlTemplate

  •  0
  • RezaNoei  · 技术社区  · 6 年前

    例如:

     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 s。

    这很好。但我还有一个问题。在表单的某个地方,我想设置这些控件的样式,并为它们设置一些边距和填充,但保留默认值不变。但我的控制力会消失!!!

    我认为二次设计将隐藏默认样式。 在标准控件中 TextBox Button , ... 每当我们写一些风格,一切都是好的,风格只是设置我们的属性。

    我想,我必须将我的ControlTemplate直接分配给CustomControl,因为我必须适应这个样式化过程。但我不知道怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mm8    6 年前

    违约 Style 因为控件应该在 ResourceDictionary 打电话 generic.xaml 字典资源 Themes 在默认情况下定义控件的程序集的根目录下。

    这些名字是按惯例的,所以把你的 Themes/generic.xaml .