ответ

1

ОБНОВЛЕНИЕ 1

Если вы не хотите использовать стороннюю DLL, добавьте эти два метода в файл PasswordBoxBehavior.cs.

using System.Reflection; 

public static T FindVisualChildByName<T>(this DependencyObject fe, string name) where T : DependencyObject 
{ 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentNullException("name"); 
    } 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(fe); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(fe, i); 
     string a = child.GetValue(FrameworkElement.NameProperty) as string; 
     if (a == name) 
     { 
      return child as T; 
     } 
     T t = FindVisualChildByName<T>(child, name); 
     if (t != null) 
     { 
      return t; 
     } 
    } 
    return default(T); 
} 

public static T FindVisualParent<T>(this DependencyObject fe) where T : DependencyObject 
{ 
    for (fe = VisualTreeHelper.GetParent(fe); fe != null; fe = VisualTreeHelper.GetParent(fe)) 
    { 
     T t = fe as T; 
     if (t != null) 
     { 
      return t; 
     } 
    } 
    return default(T); 
} 

Вот обширный блог с JulMar

Adding a watermark to a PasswordBox in a Windows Store app

Here’s the code if you’d like to use it yourself.

+0

Он использует свою собственную DLL, и я не могу использовать иностранную dll в приложении моего банка. :( –

+0

См. Обновленный ответ. – Xyroid

+0

Ты отличный @Xyroid :), большое вам спасибо. –

2

Цель водяного знака, чтобы передать сообщение за контроль. В случае этой демонстрации водяной знак также исчезает после того, как вы начнете вводить текст, поэтому они больше напоминают поле «подсказка», сообщающее вам, что ожидается.

Для этого перейдем к обычному поставщику решений WPF, AttachedProperty. AttachedProperties позволяет добавлять дополнительные свойства к любому элементу управления. Вы также можете расширить его в Attachedbehaviour, где вы делаете элемент управления реагирующим на изменения свойства.

В этом примере мы используем два прикрепленных свойства. Первый «WaterrmarkProperty» принять значение водяного знака и инициализацию контроля:

public static string GetWatermark(DependencyObject obj) 
{ 
    return (string)obj.GetValue(WatermarkProperty); 
} 

public static void SetWatermark(DependencyObject obj, string value) 
{ 
    obj.SetValue(WatermarkProperty, value); 
} 

public static readonly DependencyProperty WatermarkProperty = 
    DependencyProperty.RegisterAttached("Watermark", typeof(string), typeof(TextBoxHelper), new UIPropertyMetadata(null, WatermarkChanged)); 

второго вложенное свойством является извещение, существует ли значение в поле, что шаблон связывается с и скрывает или показывает водяной знак.

public static bool GetShowWatermark(DependencyObject obj) 
{ 
    return (bool)obj.GetValue(ShowWatermarkProperty); 
} 

public static void SetShowWatermark(DependencyObject obj, bool value) 
{ 
    obj.SetValue(ShowWatermarkProperty, value); 
} 

public static readonly DependencyProperty ShowWatermarkProperty = 
    DependencyProperty.RegisterAttached("ShowWatermark", typeof(bool), typeof(TextBoxHelper), new UIPropertyMetadata(false)); 

Для TextBoxHelper, когда текст изменяется, водяной знак показан или скрытом следующим образом:

private static void CheckShowWatermark(TextBox box) 
{ 
    box.SetValue(TextBoxHelper.ShowWatermarkProperty, box.Text == string.Empty); 
} 

Это контролируется ControlTemplate:

<ControlTemplate x:Key="WatermarkedTextBoxTemplate" TargetType="{x:Type TextBox}"> 
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true"> 
     <Grid> 
      <TextBlock Text="{Binding Path=(local:TextBoxHelper.Watermark), RelativeSource={RelativeSource TemplatedParent}}" Opacity=".5" FontWeight="Bold" Visibility="{Binding (local:TextBoxHelper.ShowWatermark), Converter={StaticResource BooleanToVisibilityConverter}, RelativeSource={RelativeSource TemplatedParent}}" /> 
      <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </Grid> 
    </Microsoft_Windows_Themes:ListBoxChrome> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Источник: http://code.msdn.microsoft.com/windowsdesktop/Watermarked-TextBox-and-444ebdec

+0

Я пробую это сейчас, спасибо. Я отвечу вам после этого. –

+0

Нет класса с именем UIPropertyMetadata? –

+0

На каком языке вы используете? – Hidden

2

В Windows 8.0 вы можете использовать WatermarkPasswordBox из WinRT XAML Toolkit, который вы можете получить от here. Это дает вам свойство Watermark, чтобы установить любой элемент пользовательского интерфейса (Shape, Image и т. Д.) В качестве водяного знака или WatermarkText свойство, которое берет текст, и WatermarkTextStyle, которое занимает TextBlockStyle, чтобы вставить текст.

В Windows 8.1 вы можете также использовать новую собственность PlaceholderText.

Не стесняйтесь вырывать и изменять код элемента управления WatermarkPasswordBox из библиотеки и использовать его в своем приложении. Это лицензия MIT. Нет кредитов. Просто возьмите файлы .cs и .xaml и включите словарь ресурсов .xaml в свои Темы/Общие.xaml нравится так:

<ResourceDictionary 
     Source="ms-appx:///YourControlsLibraryNamefNotInMainApp/RelativeDirectoryPathOfTheFile/WatermarkPasswordBox.xaml" /> 
+0

Спасибо @Filip, я жду PlaceHolderText собственности :) –

 Смежные вопросы

  • Нет связанных вопросов^_^