0

フォーカスされていないときは RichTextBox であり、フォーカスされているときは TextBox になる 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;
}

問題は、テキスト ボックスが 2 つの状態を切り替えているにもかかわらず、テキスト ボックスに何も書き込めないことです。

4

2 に答える 2

1

これは単なる推測ですが、リッチ テキスト ボックスのテンプレートを完全に変更したためだと思います。ControlTemplate は、コントロールの構成方法であることを忘れないでください。多くのコントロールでは完全に変更できますが、「PART_XYZ」という名前の要素が含まれている場合があります。これは、「私を削除すると、親のテンプレート化されたコントロールが正しく機能しなくなる」ことを示しています。私の推測では、拡張しているように見える RichtTextBox が必要な PART_ コントロールを見つけられず、無効モードになるため、含まれているテキストボックスも無効になっていると思います。

私のアドバイスは、テンプレートを切り替える UserControl を使用することです。2 つのテンプレートを提供し、1 つはテキスト ボックスを使用し、もう 1 つはリッチテキスト ボックスを使用します。

于 2012-07-27T10:03:44.977 に答える
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;
    }
}
于 2012-07-27T09:58:36.607 に答える