Мне нужен элемент управления WatermarkPasswordBox, но нет в Winrt. Возможно, мы можем добавить свойство Watermark в PasswordBox. Есть ли кто-нибудь, кто может это сделать?Как добавить свойство WaterMark в PasswordBox в Winrt?
Благодаря
Мне нужен элемент управления WatermarkPasswordBox, но нет в Winrt. Возможно, мы можем добавить свойство Watermark в PasswordBox. Есть ли кто-нибудь, кто может это сделать?Как добавить свойство WaterMark в PasswordBox в Winrt?
Благодаря
ОБНОВЛЕНИЕ 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
Цель водяного знака, чтобы передать сообщение за контроль. В случае этой демонстрации водяной знак также исчезает после того, как вы начнете вводить текст, поэтому они больше напоминают поле «подсказка», сообщающее вам, что ожидается.
Для этого перейдем к обычному поставщику решений 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
Я пробую это сейчас, спасибо. Я отвечу вам после этого. –
Нет класса с именем UIPropertyMetadata? –
На каком языке вы используете? – Hidden
В Windows 8.0 вы можете использовать WatermarkPasswordBox
из WinRT XAML Toolkit, который вы можете получить от here. Это дает вам свойство Watermark
, чтобы установить любой элемент пользовательского интерфейса (Shape
, Image
и т. Д.) В качестве водяного знака или WatermarkText
свойство, которое берет текст, и WatermarkTextStyle
, которое занимает TextBlock
Style
, чтобы вставить текст.
В Windows 8.1 вы можете также использовать новую собственность PlaceholderText
.
Не стесняйтесь вырывать и изменять код элемента управления WatermarkPasswordBox
из библиотеки и использовать его в своем приложении. Это лицензия MIT. Нет кредитов. Просто возьмите файлы .cs и .xaml и включите словарь ресурсов .xaml в свои Темы/Общие.xaml нравится так:
<ResourceDictionary
Source="ms-appx:///YourControlsLibraryNamefNotInMainApp/RelativeDirectoryPathOfTheFile/WatermarkPasswordBox.xaml" />
Спасибо @Filip, я жду PlaceHolderText собственности :) –
Он использует свою собственную DLL, и я не могу использовать иностранную dll в приложении моего банка. :( –
См. Обновленный ответ. – Xyroid
Ты отличный @Xyroid :), большое вам спасибо. –