【问题标题】:Stretch Width of WPF RichTextBox within a TreeViewTreeView 中 WPF RichTextBox 的拉伸宽度
【发布时间】:2013-08-07 22:42:16
【问题描述】:

我的目标只是让 RichTextBox 占用 TreeView 内的整个行宽。下面的 XAML 将生成一个带有 RichTextBox 元素的 TreeView,但宽度只有 1 个字符宽。

我遇到过以下有关 RichTextBox 中宽度错误的帖子。这些问题可能已得到修复,因为独立的 RichTextBox 具有预期的宽度。尽管如此,我仍然尝试创建 Grids,将 Alignments 设置为 Stretch,并将 FlowDocument PageWidth 绑定到 parent,但没有成功。

[新] 我正在添加我的应用程序的描述,以防有人想提出 RTB 替代方案。我有一个包含 10-1000 个 RTB 节点的 TreeView。 TextBox 和 TextBlock 不实用,因为我需要完整的格式和用户编辑。

WPF RichTextBox with no width set

A WPF RichTextBox + Button in a StackPanel => what a mess?

<TreeView>
    <RichTextBox>
        <FlowDocument>
            <Paragraph>
                <Run>
                    Hello
                </Run>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</TreeView>

谢谢,

【问题讨论】:

    标签: c# wpf treeview richtextbox


    【解决方案1】:

    正如你所说,这是known issue

    提供的解决方法是:

    <TreeView Name="RTBContainer" >
     <RichTextBox  Width="{Binding Path=ActualWidth, ElementName=RTBContainer, Mode=OneWay}">
           <FlowDocument >
             <Paragraph>
               <Run>
                   Hello
              </Run>
            </Paragraph>
         </FlowDocument>
      </RichTextBox>
    </TreeView>
    

    【讨论】:

    • 我不确定您的应用中还有什么可能会影响这一点。在只有这个控件的沙箱中,我看不到这种延迟。
    • 谢谢,这确实解决了我最初的问题,但会产生性能问题。每次键入字符时,绑定都会延迟 2 秒 - 不可接受。有谁知道导致这种延迟的原因以及如何解决?我在帖子中添加了应用程序描述,以防有人想提出 RTB 替代方案..
    • 我的 RTB 示例项目&lt;TreeViewItem Name="RTBContainer&gt; 中多了一层,这一切都不同了。如果我绑定到 TreeView 元素而不是 TreeViewItem 一切都运行得很快(不知道为什么)。在实践中,我将不得不与 Ancestor 进行巧妙的绑定。这是因为我的 RTB 是 UserControl(无宽度属性)的顶层,稍后会使用 Code 和 MEF 将其注入 TreeView。无论如何感谢您的帮助(标记为已回答)!
    【解决方案2】:

    您的问题源于 TreeViewItem 默认模板。 TreeViewItem 元素包装放置在 TreeView 中的任何内容。 TreeViewItem 的模板是包含三列的 Grid,前两列的宽度设置为 Auto,而第三列的宽度设置为 *。保存 Header 内容的元素位于第二列,其内容对齐方式设置为 Left。

    我已经提取了 TreeViewItem 的模板并对其进行了修改,以便标题的内容容器跨越第二列和第三列,并将其内容对齐设置为拉伸。

    (这是对 WPF 模板的修改克隆,所以有点冗长)

    <TreeView>
        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <!-- set the headers content to stretch -->
                <Setter Property="Control.HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TreeViewItem" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" MinWidth="19" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition />
                                </Grid.RowDefinitions>
                                <ToggleButton IsChecked="False" ClickMode="Press" Name="Expander">
                                    <ToggleButton.Style>
                                        <Style TargetType="ToggleButton">
                                            <Style.Resources>
                                                <ResourceDictionary />
                                            </Style.Resources>
                                            <Setter Property="UIElement.Focusable">
                                                <Setter.Value>
                                                    <s:Boolean>False</s:Boolean>
                                                </Setter.Value>
                                            </Setter>
                                            <Setter Property="FrameworkElement.Width">
                                                <Setter.Value>
                                                    <s:Double>16</s:Double>
                                                </Setter.Value>
                                            </Setter>
                                            <Setter Property="FrameworkElement.Height">
                                                <Setter.Value>
                                                    <s:Double>16</s:Double>
                                                </Setter.Value>
                                            </Setter>
                                            <Setter Property="Control.Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="ToggleButton">
                                                        <Border Padding="5,5,5,5" Background="#00FFFFFF" Width="16" Height="16">
                                                            <Path Fill="#00FFFFFF" Stroke="#FF989898" Name="ExpandPath">
                                                                <Path.Data>
                                                                    <PathGeometry Figures="M0,0L0,6L6,0z" />
                                                                </Path.Data>
                                                                <Path.RenderTransform>
                                                                    <RotateTransform Angle="135" CenterX="3" CenterY="3" />
                                                                </Path.RenderTransform>
                                                            </Path>
                                                        </Border>
                                                        <ControlTemplate.Triggers>
                                                            <Trigger Property="UIElement.IsMouseOver">
                                                                <Setter Property="Shape.Stroke" TargetName="ExpandPath">
                                                                    <Setter.Value>
                                                                        <SolidColorBrush>#FF1BBBFA</SolidColorBrush>
                                                                    </Setter.Value>
                                                                </Setter>
                                                                <Setter Property="Shape.Fill" TargetName="ExpandPath">
                                                                    <Setter.Value>
                                                                        <SolidColorBrush>#00FFFFFF</SolidColorBrush>
                                                                    </Setter.Value>
                                                                </Setter>
                                                                <Trigger.Value>
                                                                    <s:Boolean>True</s:Boolean>
                                                                </Trigger.Value>
                                                            </Trigger>
                                                            <Trigger Property="ToggleButton.IsChecked">
                                                                <Setter Property="UIElement.RenderTransform" TargetName="ExpandPath">
                                                                    <Setter.Value>
                                                                        <RotateTransform Angle="180" CenterX="3" CenterY="3" />
                                                                    </Setter.Value>
                                                                </Setter>
                                                                <Setter Property="Shape.Fill" TargetName="ExpandPath">
                                                                    <Setter.Value>
                                                                        <SolidColorBrush>#FF595959</SolidColorBrush>
                                                                    </Setter.Value>
                                                                </Setter>
                                                                <Setter Property="Shape.Stroke" TargetName="ExpandPath">
                                                                    <Setter.Value>
                                                                        <SolidColorBrush>#FF262626</SolidColorBrush>
                                                                    </Setter.Value>
                                                                </Setter>
                                                                <Trigger.Value>
                                                                    <s:Boolean>True</s:Boolean>
                                                                </Trigger.Value>
                                                            </Trigger>
                                                        </ControlTemplate.Triggers>
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </ToggleButton.Style>
                                </ToggleButton>
                                <!-- other problem was here set the Borders ColumnSpan to 2 -->
                                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True" Grid.Column="1" HorizontalAlignment="Stretch" Grid.ColumnSpan="2" >
                                    <ContentPresenter Content="{TemplateBinding HeaderedContentControl.Header}" ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}" ContentSource="Header" Name="PART_Header" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                                </Border>
                                <ItemsPresenter Name="ItemsHost" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="TreeViewItem.IsExpanded">
                                    <Setter Property="UIElement.Visibility" TargetName="ItemsHost">
                                        <Setter.Value>
                                            <x:Static Member="Visibility.Collapsed" />
                                        </Setter.Value>
                                    </Setter>
                                    <Trigger.Value>
                                        <s:Boolean>False</s:Boolean>
                                    </Trigger.Value>
                                </Trigger>
                                <Trigger Property="ItemsControl.HasItems">
                                    <Setter Property="UIElement.Visibility" TargetName="Expander">
                                        <Setter.Value>
                                            <x:Static Member="Visibility.Hidden" />
                                        </Setter.Value>
                                    </Setter>
                                    <Trigger.Value>
                                        <s:Boolean>False</s:Boolean>
                                    </Trigger.Value>
                                </Trigger>
                                <Trigger Property="TreeViewItem.IsSelected">
                                    <Setter Property="Panel.Background" TargetName="Bd">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.HighlightBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                    <Setter Property="TextElement.Foreground">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.HighlightTextBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                    <Trigger.Value>
                                        <s:Boolean>True</s:Boolean>
                                    </Trigger.Value>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="TreeViewItem.IsSelected">
                                            <Condition.Value>
                                                <s:Boolean>True</s:Boolean>
                                            </Condition.Value>
                                        </Condition>
                                        <Condition Property="Selector.IsSelectionActive">
                                            <Condition.Value>
                                                <s:Boolean>False</s:Boolean>
                                            </Condition.Value>
                                        </Condition>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Panel.Background" TargetName="Bd">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                    <Setter Property="TextElement.Foreground">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                </MultiTrigger>
                                <Trigger Property="UIElement.IsEnabled">
                                    <Setter Property="TextElement.Foreground">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                    <Trigger.Value>
                                        <s:Boolean>False</s:Boolean>
                                    </Trigger.Value>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.ItemContainerStyle>
        <RichTextBox HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <FlowDocument>
                <Paragraph>
                    <Run>
                        Hello
                    </Run>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </TreeView>
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2011-06-18
      • 2016-10-17
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多