2016-08-11 54 views
0

我想创建具有用于描述TextBox值的Text-hint的TextBox。 为此目的我使用VisualBrush TextBlock显示文本框提示当TextBox为空,然后我编码转换器转换为文本框的Horizo​​ntalContentAlignment(应用该样式的控件)到AlignmentX意味着,当客观文本框如留下然后VisualBrush显示左对齐TextBlock但这个阴谋不成真。 我怎么能解决这个问题像波纹管:从样式到应用样式的控件的绑定

enter image description here

我的XAML代码:

<Window.Resources> 
    <local:HorizontalAlignToAlignX x:Key="HAligToXAlig"/> 
    <Style TargetType="{x:Type TextBox}" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <Style.Resources> 
      <VisualBrush x:Key="CueBannerBrush" 
         Stretch="None" 
         AlignmentX="{Binding HorizontalContentAlignment, Converter={StaticResource HAligToXAlig}}"> 
       <VisualBrush.Visual> 
        <TextBlock Text="search" Foreground="LightGray"/> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </Style.Resources> 
     <Style.Triggers> 
      <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> 
       <Setter Property="Background" Value="{StaticResource CueBannerBrush}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <TextBox x:Name="textBox" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top" 
      Width="342" 
      HorizontalContentAlignment="Right" /> 
</Grid> 

我的转换代码:

class HorizontalAlignToAlignX : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     AlignmentX Align = AlignmentX.Right; 
     switch ((HorizontalAlignment)value) 
     { 
      case HorizontalAlignment.Left: 
       Align = AlignmentX.Left; 
       break; 
      case HorizontalAlignment.Center: 
       Align = AlignmentX.Center; 
       break; 
      case HorizontalAlignment.Right: 
       Align = AlignmentX.Right; 
       break; 
      case HorizontalAlignment.Stretch: 
       Align = AlignmentX.Center; 
       break; 
      default: 
       break; 
     } 
     return Align; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

您是否调试过转换器部件?至少要找到问题.. – Jose

+0

@Kirenenko转换器不会按照BreakPoint运行 – amirhossein

回答

1

我通过资助我的回答的RelativeSource = { RelativeSource FindAncestor,AncestorType = {x:Type TextBox}} like bellow:

<Window.Resources> 
    <local:HorizontalAlignToAlignX x:Key="HAligToXAlig" /> 
    <Style TargetType="{x:Type TextBox}" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <Style.Resources> 
      <VisualBrush x:Key="CueBannerBrush" 
         Stretch="None" 
         AlignmentX="{Binding ConverterParameter=HorizontalContentAlignment, Converter={StaticResource HAligToXAlig}, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBox}}, Path=HorizontalContentAlignment}"> 
       <VisualBrush.Visual> 
        <TextBlock Text="search" 
           Foreground="LightGray" 
           TextAlignment="Right" /> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </Style.Resources> 
     <Style.Triggers> 
      <Trigger Property="Text" 
        Value="{x:Static sys:String.Empty}"> 
       <Setter Property="Background" 
         Value="{StaticResource CueBannerBrush}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <TextBox x:Name="textBox" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top" 
      Width="342" 
      HorizontalContentAlignment="Right" /> 
</Grid>