2016-09-21 6 views
1

На Xamarin есть элемент управления под названием Entry. Он поддерживает TextPreview, который походит на текст по умолчанию, который отображается в «фоновом режиме», когда TextBox пуст.TextPreview на текстовом поле WPF

Я использовал How can I add a hint text to WPF textbox?, чтобы заставить его работать над одним TextBox. Теперь я хочу сделать это многоразовым (создайте CustomControl в WPF). Я также пытался подделать его в глобальный Stylehere, но у меня действительно не было того, чего я хотел. -

Short story: Как я могу получить этот CustomControl?

Я не могу дальше, чем это:

public class TextboxWithPreview : TextBox 
{ 
    public TextboxWithPreview() 
    { 
     if(DesignerProperties.GetIsInDesignMode(this)) 
     { 
      this.TextPreview = "Default TextPreview"; 
     } 
     EventManager.RegisterClassHandler(typeof(TextboxWithPreview), TextChangedEvent, new TextChangedEventHandler(OnTextChanged));  
    } 

    public static readonly DependencyProperty TextPreviewProperty = DependencyProperty.Register("TextPreview", typeof(string), typeof(TextboxWithPreview)); 

    private static void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     //pseudo Code: 
     if(string.IsNullOrEmpty(this.Text)) 
     { 
      this.Text = TextPreview; 
      this.ForeColor = Colors.Gray; 
     } 
    } 

    public string TextPreview 
    { 
     get { return (string)GetValue(TextPreviewProperty); } 
     set { SetValue(TextPreviewProperty, value); } 
    }   
} 

Мои мысли по этому поводу:

Можно ли зарегистрировать второе событие к существующей собственности? Если это так, я хотел бы прикрепить свой второй EventHandler к TextChanged. Как только очищается Text, я хочу показать Preview.

Чтобы сделать вещи ясно:

Я хочу создать CustomControl - никаких обходных путей. Поскольку это реализовано в Xamarin.Forms.Entry, это возможно.

+1

Это называется водяной знак. См. Этот вопрос. ^^ –

+0

@LynnCrumbling хорошо ... История Watermark - ОДНОЕ решение, чтобы заставить его работать. Как я уже описал выше, я уже работал, используя «Силез». «Дубликат», который вы предоставили, касается не создания настраиваемого элемента управления. –

+1

Я вижу несколько ответов на этот вопрос, которые предоставляют решение, используя элемент управления, созданный в текстовом поле. Я не думаю, что вы изучили все ответы. –

ответ

1

Вы будете сражаться в гору, пытаясь сделать это, установив существующее свойство текста. Может быть проще разместить ярлык над TextBox и изменить его видимость.

CustomControl's, как правило, с использованием ControlTemplate, этот шаблон должен быть расположен в тематике/Generic.xaml.

TextboxWithPreview.cs

public class TextboxWithPreview : TextBox 
{ 
    public static DependencyProperty TextPreviewProperty = DependencyProperty.Register("TextPreview", typeof(string), typeof(TextboxWithPreview)); 

    public string TextPreview 
    { 
     get { return (string)GetValue(TextPreviewProperty); } 
     set { SetValue(TextPreviewProperty, value); } 
    } 

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

Generic.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Local="YourNamespace"> 

    <!-- Describes how to style a TextboxWithPreview--> 
    <Style x:Key="{x:Type Local:TextboxWithPreview}" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type Local:TextboxWithPreview}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Local:TextboxWithPreview}"> 
        <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"> 
         <Grid x:Name="LayoutGrid"> 
          <ScrollViewer x:Name="PART_ContentHost" Margin="2" /> 
          <Label x:Name="TextPreview" Content="{Binding TextPreview, RelativeSource={RelativeSource TemplatedParent}}" 
            FontStyle="Italic" Margin="2" Padding="2,0,0,0" /> 
         </Grid> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="HasText" Value="True"> 
          <Setter Property="Visibility" TargetName="TextPreview" Value="Hidden" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 
Смежные вопросы