C# 从类中创建属性

C# 从类中创建属性,c#,wpf,xaml,C#,Wpf,Xaml,我创建了一个类,它缩短文本以适合文本框,同时还添加了“…” 例如: [ThisTextis]toolong>[ThisTex…] 我正在Windows 8.1虚拟机(虚拟机)上使用Microsoft Visual Studio 2013,该软件是一个应用程序 现在它可能不是完美的,但它工作得非常好。我现在想知道的是,我是否可以从该类中创建布尔属性,以便用户可以在XAML中的文本框中启用/禁用它: <TextBox CutText="True"/> 我很抱歉地通知你,你浪费了时间。W

我创建了一个类,它缩短文本以适合文本框,同时还添加了“…”

例如:

[ThisTextis]toolong>[ThisTex…]

我正在Windows 8.1虚拟机(虚拟机)上使用Microsoft Visual Studio 2013,该软件是一个应用程序

现在它可能不是完美的,但它工作得非常好。我现在想知道的是,我是否可以从该类中创建布尔属性,以便用户可以在XAML中的文本框中启用/禁用它:

<TextBox CutText="True"/>

我很抱歉地通知你,你浪费了时间。WPF已经内置了该功能。您可以将设置为
字符省略号
单词省略号
,这将自动修剪控件的溢出文本并添加省略号(
)。请参见以下简单示例:

<TextBlock TextTrimming="CharacterEllipsis" Width="150">
    Lorem ipsum dolor sit amet, consectetur adipisicing</TextBlock>

。。。其中,
TextBoxProperties
将是定义附加属性的类的名称,
CutText
将是属性本身的名称。请参阅链接页面中的,以了解如何执行此操作。您可以使用该属性中的
CutText
类。

很抱歉通知您,您浪费了时间。WPF已经内置了该功能。您可以将设置为
字符省略号
单词省略号
,这将自动修剪控件的溢出文本并添加省略号(
)。请参见以下简单示例:

<TextBlock TextTrimming="CharacterEllipsis" Width="150">
    Lorem ipsum dolor sit amet, consectetur adipisicing</TextBlock>

。。。其中,
TextBoxProperties
将是定义附加属性的类的名称,
CutText
将是属性本身的名称。请参阅链接页面中的,以了解如何执行此操作。您可以使用该属性中的
CutText
类。

既不可能也没有必要执行您试图执行的操作。不能像这样向现有组件添加新特性。此外,如果您需要,还可以通过为
文本框定义一个WPF样式来实现您想要做的事情。不能像这样向现有组件添加新特性。另外,如果您希望,有一种更简单的方法来实现您想要做的事情,即使用其他答案中的建议为
TextBox

定义WPF样式,我已经编写了一个
自定义控件
,它应该对您有用

public class TrimmedTextBox : TextBox
{
    public bool Trim
    {
        get { return (bool)GetValue(TrimProperty); }
        set { SetValue(TrimProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Trim.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TrimProperty =
        DependencyProperty.Register("Trim", typeof(bool), typeof(TrimmedTextBox), new PropertyMetadata(true));

    public TextTrimming Trimming
    {
        get { return (TextTrimming)GetValue(TrimmingProperty); }
        set { SetValue(TrimmingProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Trimming.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TrimmingProperty =
        DependencyProperty.Register("Trimming", typeof(TextTrimming), typeof(TrimmedTextBox), new PropertyMetadata(TextTrimming.CharacterEllipsis));

    static TrimmedTextBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(TrimmedTextBox), new FrameworkPropertyMetadata(typeof(TrimmedTextBox)));
    }
}
以及
样式

<Style TargetType="{x:Type local:TrimmedTextBox}"
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TrimmedTextBox}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ScrollViewer x:Name="PART_ContentHost"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsKeyboardFocused" Value="False"/>
                <Condition Property="Trim" Value="True"/>
            </MultiTrigger.Conditions>

            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                            <TextBlock Text="{TemplateBinding Text}" 
                                       TextTrimming="{Binding Trimming, RelativeSource={RelativeSource TemplatedParent}}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </MultiTrigger>
    </Style.Triggers>
</Style>

用法:

<local:TrimmedTextBox Trim="True" 
                      Text="Le toucan has arrived" 
                      Width="50" 
                      Trimming="CharacterEllipsis"/>

你可能不得不玩弄这种风格,以获得想要的外观和感觉,但想法仍然存在。这是一个
控制模板
,它扩展了
文本框
,允许您设置是否要文本框修剪内容以及需要修剪的类型


有关
自定义控件的更多信息,请参见。

使用其他答案中的建议,我编写了一个对您有用的
自定义控件

public class TrimmedTextBox : TextBox
{
    public bool Trim
    {
        get { return (bool)GetValue(TrimProperty); }
        set { SetValue(TrimProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Trim.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TrimProperty =
        DependencyProperty.Register("Trim", typeof(bool), typeof(TrimmedTextBox), new PropertyMetadata(true));

    public TextTrimming Trimming
    {
        get { return (TextTrimming)GetValue(TrimmingProperty); }
        set { SetValue(TrimmingProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Trimming.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TrimmingProperty =
        DependencyProperty.Register("Trimming", typeof(TextTrimming), typeof(TrimmedTextBox), new PropertyMetadata(TextTrimming.CharacterEllipsis));

    static TrimmedTextBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(TrimmedTextBox), new FrameworkPropertyMetadata(typeof(TrimmedTextBox)));
    }
}
以及
样式

<Style TargetType="{x:Type local:TrimmedTextBox}"
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TrimmedTextBox}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ScrollViewer x:Name="PART_ContentHost"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsKeyboardFocused" Value="False"/>
                <Condition Property="Trim" Value="True"/>
            </MultiTrigger.Conditions>

            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                            <TextBlock Text="{TemplateBinding Text}" 
                                       TextTrimming="{Binding Trimming, RelativeSource={RelativeSource TemplatedParent}}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </MultiTrigger>
    </Style.Triggers>
</Style>

用法:

<local:TrimmedTextBox Trim="True" 
                      Text="Le toucan has arrived" 
                      Width="50" 
                      Trimming="CharacterEllipsis"/>

你可能不得不玩弄这种风格,以获得想要的外观和感觉,但想法仍然存在。这是一个
控制模板
,它扩展了
文本框
,允许您设置是否要文本框修剪内容以及需要修剪的类型


有关
自定义控件的更多信息,请参阅。

您想要实现的目标还不太清楚。您希望发生什么,请给出一系列操作。@JamesHarcourt好吧,简单地说,我想创建一个类似
TextBlock.texttiming
属性的属性,但它是一个TextBox而不是一个TextBlock。您想要实现什么还不是很清楚。你想做什么,请给出一系列操作。@JamesHarcourt好吧,简单地说,我想创建一个类似
TextBlock.texttiming
属性的属性,但是是一个TextBox而不是一个TextBlock。我想他想要的是一个
TextBox
,而不是
TextBlock
。不幸的是,内置功能仅适用于文本块,而不适用于文本框,这也是我创建新类的原因。请参阅问题以获得解决方案。另一种选择是CodeProject上的页面。@Sheridan感谢您的建议。我已经使用了第二个链接来编程我的类。第一个链接有一个有趣的概念,如果我只使用几个文本框,它将非常有用。然而,在我的例子中,我们将需要数百个文本框的属性,这看起来非常混乱。这就是为什么我试图创建一个更简单的解决方案。我认为他想要的是
文本框
,而不是
文本块
。不幸的是,内置功能只存在于文本块,而不存在于文本框,这也是我创建新类的原因。请参阅问题以获得解决方案。另一种选择是CodeProject页面。@Sheridan感谢您的建议。我已经使用了第二个链接来编程我的类。第一个链接有一个有趣的概念,如果我只使用几个文本框,它将非常有用。然而,在我的情况下,我们将需要数百年的财产