就这样,我在 wpf 中制作了 ac# 项目,并且我坚持尝试制作一个带有分隔文本的行的文本框。
目前我得到了这样的文本框:
而不是使用“-------”我想在文本框中创建一个预定义的行。这可能吗 ?
聚合酶。文本框在运行时可编辑
绘制的线应具有以下属性:
- 它不应该是可编辑的!
- 它不应该只是一个空行
- 它应该是一条具有宽度的可见线
line.width = box.width
!
如果您不需要完整的文本框实现,那么这可能会有所帮助。不显示光标等确实存在问题,但可能会给您一个开始。
首先将以下转换器添加到您的项目中。
public class TextLineConverter : MarkupExtension, IValueConverter
{
static TextLineConverter converter;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string[] results = null;
string newText = value as string;
if (newText != null)
{
results = newText.Split('\r');
if (results.Length > 0)
for (int i = 0; i < results.Length; i++)
if (results[i].Length > 0)
if (results[i][0] == '\n')
results[i] = results[i].Substring(1, results[i].Length - 1);
}
return results;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (converter == null) converter = new TextLineConverter();
return converter;
}
public TextLineConverter()
{
}
}
以及以下风格。
<Style TargetType="TextBox">
<Style.Resources>
<Style TargetType="ListViewItem">
<Setter Property="Margin" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="IsEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderThickness="0,0,0,2" BorderBrush="Black" >
<ContentPresenter Content="{Binding}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<ListView Focusable="False" ItemsSource="{Binding Text, Converter={local:TextLineConverter}, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在重新阅读您的问题时,我相信做您想做的最好的方法是创建您自己的用户控件,该控件具有专门用于此的属性。对 C# 用户控件进行一些研究,也许你会发现如何做到这一点。