【问题标题】:Separate text in a Textbox with a drawn line?用画线分隔文本框中的文本?
【发布时间】:2012-12-09 17:54:44
【问题描述】:

就这样,我在 wpf 中制作了一个 c# 项目,但我一直在尝试制作一个带有分隔文本的行的文本框。

目前我得到了这样的文本框:

我想在文本框中创建一个预定义的行,而不是使用“------”。这可能吗?

聚合。文本框在运行时可编辑

绘制的线应具有以下属性:

  • 它不应该是可编辑的!
  • 不应该只是空行
  • 它应该是一条宽度为line.width = box.width的可见线!

【问题讨论】:

  • 拆分文本?这意味着什么?根据什么拆分?两部分?那是三个部分。
  • 我提到的是一条黑线分隔文本框中的文本。在这种情况下,两条分隔线
  • @user1735774 为什么不是列表框?
  • @lazyberezovsky 我正在使用 ObservableCollection 中的文本框。并且文本框已编号,因此我可以撤消/重做等。
  • 您应该能够使用列表框和 ObservableCollection 做您想做的事情。处理撤消的是您的视图对象,而不是文本框。

标签: c# wpf textbox split separator


【解决方案1】:

如果您不需要完整的文本框实现,那么这可能会有所帮助。不显示光标等确实存在问题,但可能会给您一个开始。

首先将以下转换器添加到您的项目中。

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>

【讨论】:

    【解决方案2】:

    在重新阅读您的问题时,我相信做您想做的最好的方法是创建您自己的用户控件,该控件具有专门用于此的属性。对 C# 用户控件进行一些研究,也许你会发现如何做到这一点。

    【讨论】:

    • 呵呵,这不是我要找的,而是我必须说的一个聪明而简单的答案。我想在“-----”的位置“画”一条可见的黑线. \n \n 只是做一个“空”行。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多