TextBox
我有一個案例,我需要為我的 WPF 應用程式中的禁用控制元件設定默認文本。即啟用的控制元件可能包含空文本,但是當使用空文本禁用控制元件時,應該顯示系結值,例如“無資料”。
在 WPF 中有沒有合適的方法來做到這一點?
uj5u.com熱心網友回復:
您可以使用這樣的行為:
public enum DisplayDefaultTextMode
{
TextBoxTextEmpty,
TextBoxDisabledAndTextEmpty
}
public class DefaultTextBoxValueBehavior : Behavior<TextBox>
{
public DisplayDefaultTextMode DisplayMode { get; set; } = DisplayDefaultTextMode.TextBoxDisabledAndTextEmpty;
public string DefaultText
{
get => (string)GetValue(DefaultTextProperty);
set => SetValue(DefaultTextProperty, value);
}
public static readonly DependencyProperty DefaultTextProperty =
DependencyProperty.Register(
nameof(DefaultText),
typeof(string),
typeof(DefaultTextBoxValueBehavior),
new PropertyMetadata(string.Empty));
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded = onl oaded;
AssociatedObject.TextChanged = OnTextChanged;
AssociatedObject.IsEnabledChanged = OnIsEnabledChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.Loaded -= onl oaded;
AssociatedObject.TextChanged -= OnTextChanged;
AssociatedObject.IsEnabledChanged -= OnIsEnabledChanged;
}
private void OnLoaded(object sender, RoutedEventArgs e) => SetDefaultTextIfNeeded();
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
if (AssociatedObject.Text?.Length == 0 && e.Changes.Any(c => c.RemovedLength > 0))
{
//ignore since we expect the user to cleare the field for futher input
}
else
SetDefaultTextIfNeeded();
}
private void OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) => SetDefaultTextIfNeeded();
private void SetDefaultTextIfNeeded()
{
if (CheckShouldSetDefaultText())
SetDefaultText();
}
private bool CheckShouldSetDefaultText()
{
if (DisplayMode == DisplayDefaultTextMode.TextBoxTextEmpty)
return string.IsNullOrEmpty(AssociatedObject.Text);
else
return string.IsNullOrEmpty(AssociatedObject.Text) && !AssociatedObject.IsEnabled;
}
private void SetDefaultText()
{
AssociatedObject.TextChanged -= OnTextChanged;
AssociatedObject.Text = DefaultText;
AssociatedObject.TextChanged = OnTextChanged;
}
}
使用示例:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<TextBox>
<i:Interaction.Behaviors>
<behaviors:DefaultTextBoxValueBehavior
DisplayMode="TextBoxDisabledAndTextEmpty"
DefaultText="Default text"/>
</i:Interaction.Behaviors>
</TextBox>
注意!您可以在行為中定義DisplayMode
屬性以設定默認文本外觀。如果您設定DisplayDefaultTextMode.TextBoxTextEmpty
默認文本,則如果 texbox 文本為空或為空,則將設定默認文本。如果您設定DisplayDefaultTextMode.TextBoxDisabledAndTextEmpty
了默認文本,則只會將其設定為帶有空文本的禁用文本框。
希望對您有所幫助。
uj5u.com熱心網友回復:
您不需要轉換器,它可以在純 XAML 中完成。
首先,將游標放在一個 TextBox 上,然后在 Properties 窗格中選擇 Miscellaneous -> Template -> Convert to New Resource。這將模板化你的控制,給你一些東西來編輯。只需將PART_ContentHost
元素更改為包含默認文本的 TextBlock:
<SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
<SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>
<ControlTemplate x:Key="TextBoxTemplate1" TargetType="{x:Type TextBoxBase}">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<!--<ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>-->
<TextBlock Text="Nothing to see here!" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
現在只需使用一種樣式將 ControlTemplate 應用于控制元件被禁用時:
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="TextBox.IsEnabled" Value="false">
<Setter Property="Template" Value="{DynamicResource TextBoxTemplate1}" />
</Trigger>
</Style.Triggers>
</Style>
所以現在當你在你的 XAML 中加入這樣的東西時:
<StackPanel Orientation="Vertical">
<TextBox Width="150" Text="This textbox is enabled" />
<TextBox Width="150" Text="This textbox is disabled" IsEnabled="False" />
</StackPanel>
...你得到這個:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496843.html