2016-11-16 56 views
0

我必须为单个窗口使用1800行XAML定义,并且我希望大幅减少代码量。使用集成文本框创建边框样式

有几个控制定义,经常重复,我想为其中一些编写样式。一个示例是带有集成TextBox的边框定义:

<Border Grid.Column="2" Margin="1,1,5,0" Background="#bbc2ce"> 
    <my:RibbonTextBox HorizontalContentAlignment="Center" 
         IsReadOnly="True" Background="#FAFAFA" 
         Text="{Binding Path=someViewModel.Item,Mode=OneWay}" 
         MinHeight="0" FontSize="12" FontWeight="Bold" FontFamily="Arial"/> 
</Border> 

除了绑定路径之外,每个值都一次又一次地完全相同。所以我为RibbonTextBox编写了这个样式:

<Style TargetType="my:RibbonTextBox" x:Key="StandardRibbonTextBox"> 
    <Setter Property="HorizontalAlignment" Value="Center" /> 
    <Setter Property="IsReadOnly" Value="True" /> 
    <Setter Property="Background" Value="#FAFAFA" /> 
    <Setter Property="MinHeight" Value="0" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="FontFamily" Value="Arial" /> 
</Style> 

现在我想为上述边框编写样式,并整合了RibbonTextBox样式。这里我到目前为止:

<Style TargetType="Border" x:Key="borderStyle"> 
    <Setter Property="Background" Value="#bbc2ce" /> 
</Style> 

有没有可能在这里集成我的TextBox风格?如果没有,有人知道,如何解决这个问题?

在此先感谢!

+1

号'Border.Child = TextBox'不能样式一起(除非你重新定义父控制模板,但你不能再用来设置嵌套控制不同的结合),但是可以为两者创建两种样式。如果您必须使用可重复的布局(组),请考虑使用'UserControl'。 – Sinatr

+0

@Sinatr:谢谢! – Joshit

回答

0

如果你只需要只读文本框,您可以使用DataTemplateContentPresenter为编码如下(以简单TextBox示范更换my:RibbonTextBox)。如果你需要读写,你必须提供一些允许读写的绑定方式。这可以通过ControlTemplate(也在示例代码中)来实现。

<Grid x:Name="grid1"> 
    <Grid.Resources> 

     <Style TargetType="TextBox" x:Key="StandardRibbonTextBox"> 
      <!--Changed that one from HorizontalAlignment, in comparison to the question--> 
      <Setter Property="HorizontalContentAlignment" Value="Center" /> 
      <Setter Property="IsReadOnly" Value="True" /> 
      <Setter Property="Background" Value="#FAFAFA" /> 
      <Setter Property="MinHeight" Value="0" /> 
      <Setter Property="FontSize" Value="12" /> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Setter Property="FontFamily" Value="Arial" /> 
     </Style> 

     <Style TargetType="Border" x:Key="borderStyle"> 
      <Setter Property="Background" Value="#bbc2ce" /> 
      <Setter Property="Margin" Value="1,1,5,0"/> 
      <Setter Property="Padding" Value="5"/> 
     </Style> 

     <DataTemplate x:Key="borderedTextboxTemplate" DataType="{x:Type sys:String}"> 
      <Border Style="{StaticResource borderStyle}"> 
       <!--This is not going to work for two way binding (IsReadOnly="False" and Text="{Binding Mode=TwoWay}")--> 
       <TextBox Style="{StaticResource StandardRibbonTextBox}" Text="{Binding Mode=OneWay}"/> 
      </Border> 
     </DataTemplate> 

     <ControlTemplate x:Key="borderedTextboxControlTemplate" TargetType="TextBox"> 
      <Border Style="{StaticResource borderStyle}"> 
       <!--This is not going to work for two way binding (IsReadOnly="False" and Text="{Binding Mode=TwoWay}")--> 
       <TextBox Style="{StaticResource StandardRibbonTextBox}" Text="{Binding Text,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/> 
      </Border> 
     </ControlTemplate> 

     <Style x:Key="borderedTextboxControlStyle" TargetType="TextBox"> 
      <Setter Property="Template" Value="{StaticResource borderedTextboxControlTemplate}"/> 
     </Style> 

    </Grid.Resources> 

    <StackPanel Margin="10"> 
     <!--Using Controls directly--> 
     <Border Style="{StaticResource borderStyle}"> 
      <TextBox 
       Text="{Binding Path=someViewModel.Item,Mode=OneWay}" 
       Style="{StaticResource StandardRibbonTextBox}"/> 
     </Border> 
     <Separator Margin="10"/> 
     <!--Using DataTemplate--> 
     <ContentPresenter 
      Content="{Binding Path=someViewModel.Item,Mode=OneWay}" 
      ContentTemplate="{StaticResource borderedTextboxTemplate}"/> 
     <Separator Margin="10"/> 
     <!--Using ControlTemplate via Style--> 
     <TextBox Text="{Binding Path=someViewModel.Item,Mode=OneWay}" Style="{StaticResource borderedTextboxControlStyle}"/> 
    </StackPanel> 
</Grid> 
+0

谢谢..并遗憾地错过了反馈! – Joshit

+0

@Joshit这一个让我感到惊讶,谢谢你再次回过头来看看:) – grek40

+0

肯定!我非常感谢支持,其实不是我的风格,只是不回答..答案的缺失有一些不太好的理由,我觉得我必须尊重你在你的答案中的时间和精力..这就是为什么:感谢你的支持 ;) – Joshit