【问题标题】:How to switch between TextBox and RichTextBox via templates如何通过模板在 TextBox 和 RichTextBox 之间切换
【发布时间】:2012-07-27 09:11:55
【问题描述】:

我想写一个TextBox控件,当它失焦时它是一个RichTextBox,当它聚焦时它变成一个TextBox。

我尝试了几种方法,但都没有奏效。几乎可以工作的唯一解决方案如下所示:

<RichTextBox x:Name="headText" Document="{Binding HeadDocument}" GotFocus="headText_GotFocus" LostFocus="headText_LostFocus">
        <Controls:HyperlinkRichTextBox.Resources>
            <ControlTemplate x:Key="headTemplate">
                <TextBox Text="{Binding Head}" />
            </ControlTemplate>
        </Controls:HyperlinkRichTextBox.Resources>
</RichTextBox>

在后面的代码中:

private ControlTemplate oldTemplate;

private void headText_GotFocus(object sender, RoutedEventArgs e)
{
    var controlTemplate = headLineText.FindResource("headTemplate") as ControlTemplate;
    oldTemplate = headText.Template;
    headText.Template = controlTemplate;
    headText.Focus();
}

private void headText_LostFocus(object sender, RoutedEventArgs e)
{
    headText.Template = oldTemplate;
}

问题是虽然文本框在两种状态之间切换,但是我不能往文本框里写任何东西!

【问题讨论】:

    标签: c# .net wpf richtextbox controltemplate


    【解决方案1】:

    这篇文章应该可以帮助您入门:http://weblogs.asp.net/thomaslebrun/archive/2009/03/24/wpf-how-to-develop-and-editable-textblock.aspx

    这是一个改编,你需要添加 TextBox 和 RichTextBox 的值绑定部分:

    XAML

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type local:EditableTextBlock}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:EditableTextBlock}">
                            <Grid x:Name="PART_GridContainer">
                                <RichTextBox x:Name="PART_TbDisplayText" Visibility="Visible" />
                                <TextBox x:Name="PART_TbEditText" Visibility="Hidden" />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="BorderBrush" Value="Red" />
            </Style>
            <Style TargetType="RichTextBox">
                <Setter Property="BorderBrush" Value="Blue" />
            </Style>
        </Grid.Resources>
        <StackPanel>
            <local:EditableTextBlock />
            <Button>Lose focus</Button>
        </StackPanel>
    </Grid>
    

    代码:

    [TemplatePart(Type = typeof(Grid), Name = EditableTextBlock.GRID_NAME)]
    [TemplatePart(Type = typeof(RichTextBox), Name = EditableTextBlock.RICHTEXTBOX_DISPLAYTEXT_NAME)]
    [TemplatePart(Type = typeof(TextBox), Name = EditableTextBlock.TEXTBOX_EDITTEXT_NAME)]
    public class EditableTextBlock : Control
    {
        private const string GRID_NAME = "PART_GridContainer";
        private const string RICHTEXTBOX_DISPLAYTEXT_NAME = "PART_TbDisplayText";
        private const string TEXTBOX_EDITTEXT_NAME = "PART_TbEditText";
    
        private Grid gridContainer;
        private RichTextBox richTextBox;
        private TextBox textBox;
    
        static EditableTextBlock()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(EditableTextBlock), new FrameworkPropertyMetadata(typeof(EditableTextBlock)));
        }
    
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this.gridContainer = this.Template.FindName(GRID_NAME, this) as Grid;
    
            if (this.gridContainer != null)
            {
                this.richTextBox = this.gridContainer.Children[0] as RichTextBox;
                this.richTextBox.GotFocus += new RoutedEventHandler(richTextBoxGotFocus);
                this.textBox = this.gridContainer.Children[1] as TextBox;
                this.textBox.LostFocus += this.textBoxLostFocus;
            }
        }
    
        private void richTextBoxGotFocus(object sender, RoutedEventArgs e)
        {
            this.richTextBox.Visibility = Visibility.Hidden;
            this.textBox.Visibility = Visibility.Visible;
            this.textBox.Focus();
        }
    
        private void textBoxLostFocus(object sender, RoutedEventArgs e)
        {
            this.richTextBox.Visibility = Visibility.Visible;
            this.textBox.Visibility = Visibility.Hidden;
        }
    }
    

    【讨论】:

    • 谢谢!我会试试这个!注意:认为 this.textBox.Focus() 应该包含在 textBoxLostFocus 方法中...
    【解决方案2】:

    这只是一个猜测,但我会这么说,因为您完全更改了富文本框的模板。请记住,ControlTemplate 是您的控件的组成方式。许多控件允许您完全修改它,但有时包含以“PART_XYZ”命名的元素,这些表示“如果您删除我,我的父模板化控件将无法正常运行”。我现在的猜测是,您似乎扩展的 RichtTextBox 找不到任何必要的 PART_ 控件并进入禁用模式,因此您包含的文本框也被禁用。

    我的建议是,使用切换模板的 UserControl。提供 2 个模板,一个带有文本框,一个带有richtextbox。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2016-11-25
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多