2012-12-25 12 views
12

Chciałbym ustawić właściwość maxType ToolTip, aby wyświetlać długie teksty poprawnie. Ponadto potrzebuję zawijania tekstu. Użyłem tego stylu:WPF - Setting ToolTip MaxWidth

<Style TargetType="ToolTip"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding}" MaxWidth="400" TextWrapping='Wrap' /> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
</Style> 

Ten styl podpowiedzi jest OK w moim rozumieniu. Jednak nie jest skuteczny w przypadku niektórych elementów sterujących, które mają własny styl podpowiedzi. Na przykład etykieta podpowiedzi następującego przycisku nie może się pojawić.

<Button> 
    <Button.ToolTip> 
     <StackPanel> 
      <TextBlock Style="{StaticResource firstText}" Text="aaaaaaaaaaaaa"/> 
      <TextBlock Style="{StaticResource secondText}" Text="bbbbbbbbbbbbb"/>  
      <TextBlock Bacground="Red" Text="ccccccccccccc"/>  
     </StackPanel> 
    </Button.ToolTip> 
</Button> 

Chcę ustawić właściwość maxwidth z zawijania tekstu dla wszystkich podpowiedzi. Co mogę zrobić dla tego problemu?

+0

Co rozumiesz przez ** dla niektórych elementów sterujących, które mają własny styl podpowiedzi. **? – Ramin

+0

Mam na myśli konkretne podpowiedzi. Na przykład przycisk na przykład składa się z trzech bloków tekstu. Ale jeśli użyję takich jak:

+0

Podniosłem to, ale myślę, że powinieneś wyjaśnić swój ** cel ** więcej. Zawsze są lepsze sposoby robienia rzeczy :-). – Ramin

Odpowiedz

10

Po stylu Podpowiedź to przydatne dla mnie:

<Style TargetType="ToolTip" x:Key="InternalToolTipStyle"> 
    <Setter Property="MaxWidth" Value="{Binding Path=(lib:ToolTipProperties.MaxWidth)}" /> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <ContentPresenter Content="{TemplateBinding Content}" > 
        <ContentPresenter.Resources> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Setter Property="TextWrapping" Value="Wrap" /> 
         </Style> 
        </ContentPresenter.Resources> 
       </ContentPresenter> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Z tego stylu, etykietka z następujących przycisku pojawia się prawidłowo:

<Button> 
<Button.ToolTip> 
    <StackPanel> 
     <TextBlock Style="{StaticResource firstText}" Text="aaaaaaaaaaaaa"/> 
     <TextBlock Style="{StaticResource secondText}" Text="bbbbbbbbbbbbb"/>  
     <TextBlock Bacground="Red" Text="ccccccccccccc"/>  
    </StackPanel> 
</Button.ToolTip> 

1

Użyj tego:

<Window.Resources> 
<Style TargetType="ToolTip" x:Key="TT"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding}" MaxWidth="400" TextWrapping='Wrap' /> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</Window.Resources> 

<Button> 
    <Button.ToolTip> 
     <ToolTip Style="{StaticResource TT}"> 
    bbbbbbbbbbbbbbbbbbbdddddddddddddddddbbbmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 
     </ToolTip> 
    </Button.ToolTip> 
</Button> 

Edit:

<Button> 
    <Button.ToolTip> 
     <RichTextBox> 
      <FlowDocument> 
       <Paragraph> 
       This is flow content and you can <Bold>edit me!</Bold> 
       </Paragraph> 
      </FlowDocument> 
</RichTextBox> 
    </Button.ToolTip> 
</Button> 

patrz: RichTextBox Overview

+0

Nie powinienem zmieniać zawartości kontrolki. Przycisk powinien wyglądać jak moje pytanie (z panelem Stackpanel z dwoma blokami tekstu). – iremce

+0

@iremce Przycisk mojego przykładu jest taki sam jak twój. Ustawiłeś jego etykietkę na StackPanel, ale zmieniam ją na etykietę z Twoim stylem. Myślę, że powinieneś wyjaśnić swój cel. Dlaczego nie korzystać ze stylu podpowiedzi? Czy chcesz, aby w ToolTip były wyświetlane dwa akapity? – Ramin

+0

Tak, etykietka przycisku lub innego elementu sterującego może składać się z więcej niż akapitów. Nie powinienem zmieniać struktury podpowiedzi kontrolek. – iremce

15

unikam używania szablonu, ponieważ wiele rzeczy należy wdrożyć. Więc bardziej elegancki sposób to zrobić

<Style TargetType="ToolTip"> 
    <Style.Resources> 
     <Style TargetType="ContentPresenter"> 
      <Style.Resources> 
       <Style TargetType="TextBlock"> 
        <Setter Property="TextWrapping" Value="Wrap" /> 
       </Style> 
      </Style.Resources> 
     </Style> 
    </Style.Resources> 
    <Setter Property="MaxWidth" Value="500" /> 
</Style> 
+1

To jest rzeczywiście bardzo dobre i czyste rozwiązanie z dużym wielokrotnym użyciem. Myślę, że użycie x: Type jest jeszcze bardziej rygorystyczne i czystsze w TargetType. –

12

Zdaję sobie sprawę, że jest to stara sprawa, ale nikt nie sugerują najbardziej oczywiste i najprostsze rozwiązanie tego problemu jeszcze. W związku z tym pomyślałem, że dodaję go tutaj:

<Button> 
    <Button.ToolTip> 
     <ToolTip MaxWidth="400"> 
      <TextBlock Text="{Binding Binding}" TextWrapping="Wrap" /> 
     </ToolTip> 
    </Button.ToolTip> 
</Button> 
+1

Najprostsze jedno rozwiązanie! –

+1

Prosty i dobry,;) – Coding4Fun