2012-03-05 43 views
1

私の目的は、RichTextBoxにTreeView内の行全体の幅を消費させることです。以下のXAMLはRichTextBox要素を持つTreeViewを生成しますが、幅は1文字幅です。TreeView内のWPF RichTextBoxのストレッチ幅

RichTextBoxの幅バグに関する以下の投稿があります。これらの問題は、スタンドアロンRichTextBoxが予想される幅を持つため修正されている可能性があります。これにもかかわらず、私はまだグリッドの作成、アライメントをストレッチに設定し、FlowDocument PageWidthを親にバインドして成功させませんでした。

[NEW] 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> 

おかげで、

答えて

1

あなたがこれを述べたようですknown issue

提供回避策は次のとおりです。

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

私はあなたがこれに影響を与える可能性があなたのアプリを持っている他に何かわかりません。ちょうどこのコントロールを持つ私のサンドボックスでは、私はこの遅れを見ません。 –

+0

これは私の初期の問題を解決するが、パフォーマンスの問題を作成します。バインディングでは、文字を入力するたびに2秒の遅延が発生します - 許容できません。誰もがこの遅延の原因とその解決方法を知っていますか?誰かがRTBの代替案を提案したいと思った場合に、私の投稿にアプリケーションの説明を追加しました。 – aidesigner

+1

RTBサンプルプロジェクトの aidesigner

0

問題は、TreeViewItemのデフォルトテンプレートに起因します。 TreeViewItem要素は、TreeViewに配置された任意のコンテンツをラップします。 TreeViewItemのテンプレートは、最初の2つの幅がAutoに設定され、3つ目の幅が*に設定された3つの列を含むGridです。ヘッダーコンテンツを保持する要素は2番目の列にあり、コンテンツの配置はLeftに設定されています。

私は、TreeViewItemのテンプレートを抽出し、ヘッダーのコンテンツコンテナが2番目と3番目の列にまたがってコンテンツの配置をストレッチに設定するように変更しました。

(それは少しlengthlyですので、これは、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>