C# WPF TextBox扩展无法使用MahApps TextBoxHelper
我有一个扩展的wpf文本框,我想使用MahApps TextBoxHelper添加水印。使用普通的文本框工作得很好,但当我尝试用扩展的文本框替换它们时,水印随着Metro风格消失了。“我的扩展文本框”旨在与自定义触摸键盘配合使用,它有许多事件用于处理此功能: XAML: 我遵循了我在这个解决方案中找到的建议,但到目前为止还没有解决这个问题。根据该解决方案,我需要添加一个基于TextBox的样式,因此以下是我在资源字典中的内容:C# WPF TextBox扩展无法使用MahApps TextBoxHelper,c#,wpf,xaml,mvvm,mahapps.metro,C#,Wpf,Xaml,Mvvm,Mahapps.metro,我有一个扩展的wpf文本框,我想使用MahApps TextBoxHelper添加水印。使用普通的文本框工作得很好,但当我尝试用扩展的文本框替换它们时,水印随着Metro风格消失了。“我的扩展文本框”旨在与自定义触摸键盘配合使用,它有许多事件用于处理此功能: XAML: 我遵循了我在这个解决方案中找到的建议,但到目前为止还没有解决这个问题。根据该解决方案,我需要添加一个基于TextBox的样式,因此以下是我在资源字典中的内容: <Style TargetType="local:TouchT
<Style TargetType="local:TouchTextBox" BasedOn="{StaticResource {x:Type TextBox}}" x:Key="TouchTextBoxStyle"/>
这有点吓人,但很管用 我认为您需要将此
附加属性
添加到文本框
以显示水印
controls:TextBoxHelper.Watermark="My Watermark"
controls:TextBoxHelper.UseFloatingWatermark="True" // If Needed.
带有文本框的完整代码
<TextBox Height="40" Width="125" MaxLength="15"
controls:TextBoxHelper.Watermark="My Watermark"
controls:TextBoxHelper.UseFloatingWatermark="True"/>
希望这能有所帮助。与创建自定义控件不同,您应该创建一个DependencyProperty,类似于TextBoxHelper将事件添加到普通文本框中的方式。这也将消除对样式的需要。我的TouchTextBox的每个实例实际上都是这样做的。我编辑了这篇文章以包含TouchTextBox的实例。问题是,虽然TextBoxHelper可以处理常规文本框,但当我尝试使用自定义TouchTextBox控件时,它会中断。没有错误,当我从TextBox更改为TouchTextBox时,我的水印消失了。听起来不错,我应该在哪里添加DependencyProperties?你能提供一些参考资料或例子吗?请查看并仅供参考,TextBoxHelper源代码位于感谢你的帮助Joel!这需要一些努力,我不知道这是否是最好的方法,但我已经实现了我自己的TouchTextBoxHelper!
<local:TouchTextBox x:Name="UsernameTextBox" Controls:TextBoxHelper.Watermark="Username" Width="200" Text="{Binding Username}" Style="{StaticResource TouchTextBoxStyle}"/>
<local:TouchTextBox x:Name="PasswordTextBox" Controls:TextBoxHelper.Watermark="Password" Width="200" Margin="0,30,0,0" Text="{Binding Password}" Style="{StaticResource TouchTextBoxStyle}"/>
public class TouchTextBoxHelper : DependencyObject
{
public static readonly DependencyProperty IsTouchKeyboardTargetProperty = DependencyProperty.Register("IsTouchKeyboardTarget", typeof(bool), typeof(TouchTextBoxHelper), new FrameworkPropertyMetadata(false, IsTouchKeyboardTargetChanged));
[AttachedPropertyBrowsableForType(typeof(TextBox))]
public static bool GetIsTouchKeyboardTargetEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(IsTouchKeyboardTargetProperty);
}
[AttachedPropertyBrowsableForType(typeof(TextBox))]
public static void SetIsTouchKeyboardTargetEnabled(DependencyObject obj, bool value)
{
obj.SetValue(IsTouchKeyboardTargetProperty, value);
TextBox tb = obj as TextBox;
if (tb == null) return;
if (value)
{
tb.GotFocus += TextBoxBaseGotFocus;
tb.LostFocus += TextBoxBaseLostFocus;
}
else
{
tb.GotFocus -= TextBoxBaseGotFocus;
tb.LostFocus -= TextBoxBaseLostFocus;
}
}
private static void IsTouchKeyboardTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var tb = d as TextBox;
if (null == tb)
{
throw new InvalidOperationException("The property 'IsTouchKeyboardTarget' may only be set on TextBox elements.");
}
if (e.OldValue != e.NewValue)
{
//tb.SetValue(SpellCheck.IsEnabledProperty, (bool)e.NewValue);
if ((bool)e.NewValue)
{
tb.GotFocus += TextBoxBaseGotFocus;
tb.LostFocus += TextBoxBaseLostFocus;
}
else
{
tb.GotFocus -= TextBoxBaseGotFocus;
tb.LostFocus -= TextBoxBaseLostFocus;
}
}
}
private static void TextBoxBaseGotFocus(object sender, RoutedEventArgs e)
{
TouchTextBoxEvents.tb = sender as TextBox;
StaticEvents.OnShowTouchKeyboard(sender, e);
StaticEvents.TouchKeyboardKeyTouch += TouchTextBoxEvents.StaticEvents_TouchKeyboardKeyTouch;
StaticEvents.TouchKeyboardSpaceTouch += TouchTextBoxEvents.StaticEvents_TouchKeyboardSpaceTouch;
StaticEvents.TouchKeyboardBackspaceTouch += TouchTextBoxEvents.StaticEvents_TouchKeyboardBackspaceTouch;
}
private static void TextBoxBaseLostFocus(object sender, RoutedEventArgs e)
{
StaticEvents.OnHideTouchKeyboard(sender, e);
StaticEvents.TouchKeyboardKeyTouch -= TouchTextBoxEvents.StaticEvents_TouchKeyboardKeyTouch;
StaticEvents.TouchKeyboardSpaceTouch -= TouchTextBoxEvents.StaticEvents_TouchKeyboardSpaceTouch;
StaticEvents.TouchKeyboardBackspaceTouch -= TouchTextBoxEvents.StaticEvents_TouchKeyboardBackspaceTouch;
}
}
public class TouchTextBoxEvents
{
public static TextBox tb = null;
public static void StaticEvents_TouchKeyboardKeyTouch(object sender, EventArgs e)
{
int i = tb.CaretIndex;
string t = (sender as Button).Content.ToString();
tb.Text = tb.Text.Insert(tb.CaretIndex, t);
tb.CaretIndex = i + 1;
}
public static void StaticEvents_TouchKeyboardBackspaceTouch(object sender, EventArgs e)
{
int i = tb.CaretIndex;
if (tb.CaretIndex == 0) return;
tb.Text = tb.Text.Remove(tb.CaretIndex - 1, 1);
tb.CaretIndex = i - 1;
}
public static void StaticEvents_TouchKeyboardSpaceTouch(object sender, EventArgs e)
{
int i = tb.CaretIndex;
tb.Text = tb.Text.Insert(tb.CaretIndex, " ");
tb.CaretIndex = i + 1;
}
}
controls:TextBoxHelper.Watermark="My Watermark"
controls:TextBoxHelper.UseFloatingWatermark="True" // If Needed.
<TextBox Height="40" Width="125" MaxLength="15"
controls:TextBoxHelper.Watermark="My Watermark"
controls:TextBoxHelper.UseFloatingWatermark="True"/>