0

私が望むのはそれほど難しいことではありませんが、何日も髪を引っ張っています!

Windows Explorer と同じツールチップの動作が必要なだけです。部分的に非表示のツリー/リスト要素を、完全な要素を表示するツールチップでオーバーレイします。

ツリービューで次のデータテンプレートを使用します

<HierarchicalDataTemplate DataType="{x:Type TreeVM:SurveyorTreeViewItemViewModel}" ItemsSource="{Binding Children, Converter={StaticResource surveyorSortableCollectionViewConverter}}">
    <StackPanel x:Name="SurveyorStackPanel" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Orientation="Horizontal" Height="20" Width="auto">
      ... (Textblocks, properties, usercontrol, border,... )                   
      <StackPanel.ToolTip>
          <ToolTip Placement="RelativePoint" Padding="0" HasDropShadow="False" 
               DataContext="{Binding ElementName=SurveyorStackPanel}">
                <Rectangle HorizontalAlignment="Left" VerticalAlignment="Center"
                           Width="{Binding ElementName=SurveyorStackPanel, Path=Width}"
                           Height="{Binding ElementName=SurveyorStackPanel, Path=Height}">
                     <Rectangle.Fill>
                        <VisualBrush AutoLayoutContent="True" AlignmentX="Left" 
                                     Visual="{Binding}" Stretch="None"/>
                     </Rectangle.Fill>
                </Rectangle>
           </ToolTip>
       </StackPanel.ToolTip>                                  
   </StackPanel>
</HierarchicalDataTemplate>

ご覧のとおり、Visualbrush を使用しようとしています。しかし、これはうまくいきません。画面に表示されているものだけが表示されます。

ツールチップにある新しいスタックパネルで静的リソースとバインディングを試しましたが、空白のツールチップしか残りません。

私は何か間違っていますか?代替手段を使用する必要がありますか? 私はWPFでかなり新しいです。私は基本を知っていますが、バインディング/リソースは私にとってちょっと新しいものです

ここでの編集は、私が試した静的ソースです:

<ToolTip x:Key="reflectingTooltip" DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" Placement="RelativePoint" Padding="0" HasDropShadow="False">
   <Rectangle Width="{Binding ActualWidth}" Height="{Binding Path=ActualHeight}" Margin="0"
              HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
      <Rectangle.Fill>
           <VisualBrush Visual="{Binding}" Stretch="None" AlignmentX="Left" />
      </Rectangle.Fill>
   </Rectangle>
</ToolTip>

編集2

ここに私が今持っている状況からのいくつかの写真があります: ツールチップが表示されたときに要素全体を表示する必要があります. ツールチップの前: http://desmond.imageshack.us/Himg832/scaled.php?server=832&filename=beforedo.png&res=landing

ツールチップが表示されている場合: http://desmond.imageshack.us/Himg842/scaled.php?server=842&filename=afterbl.png&res=landing

ツールチップの高さが大きすぎて、画面に表示されるものしか表示されません。唯一の問題は、隠しテキストを「埋める」ことです。

4

1 に答える 1

0

VisualBrushは、「Visual」プロパティで提供しているものとまったく同じものをビットマップとしてレンダリングします。これは、変更を加えることなく実行されます。つまり、現在とまったく同じようにレンダリングされます。

他の何かを表示したい場合は、他の何かを提供する必要があります。次のようなもので試してみてください。

<Window x:Class="UncutTooltip.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Horizontal">
        <ListBox ItemsSource="{Binding}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                    <Setter Property="Width" Value="250" />
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Transparent">
                        <TextBlock Text="{Binding TheText}"
                            TextTrimming="CharacterEllipsis">
                        </TextBlock>

                        <Grid.ToolTip>
                            <TextBlock Text="{Binding TheText}"
                            TextTrimming="CharacterEllipsis">
                            </TextBlock>
                        </Grid.ToolTip>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Border Background="Red" >
            <TextBlock Margin="5" Foreground="WhiteSmoke" FontSize="18"
                       Text="The end of window:)" TextAlignment="Center">
                <TextBlock.LayoutTransform>
                    <RotateTransform Angle="-90" />
                </TextBlock.LayoutTransform>
            </TextBlock>
        </Border>
    </StackPanel>
</Window>

---

using System.Collections.Generic;
using System.Windows;
namespace UncutTooltip
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new List<Item>
            {
                new Item { TheText = "its not that hard what i want, but i'm pulling my hairs for days!" },
                new Item { TheText = "i just want the same tooltip behaviour like the WIndows Explorer: overlay a partially hidden tree/list element with the tooltip that displays the full element" },
                new Item { TheText = "i use the following datatemplate in my treeview" },
                new Item { TheText = "As you can see, i'm trying to use Visualbrush. but this doesnt work. it only shows what you see on the screen." },
                new Item { TheText = "I have tried with static resource and binding on a new stackpanel thats in the tooltip, but that only leaves with a blanc tooltip." },
                new Item { TheText = "Do i something wrong? do i have to use alternatives? i'm pretty new in WPF. i know the basics, but binding/resources is kinda new for me" },
            };
        }
    }

    public class Item
    {
        public string TheText { get; set; }
    }
}

編集:

ここで、ツールチップの内容を次のように変更します。

                    <Grid.ToolTip>
                        <ListBox ItemsSource="{Binding TheWholeList}">
                            <ListBox.ItemContainerStyle>
                                <Style TargetType="ListBoxItem">
                                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                                    <!--<Setter Property="Width" Value="250" />-->
                                </Style>
                            </ListBox.ItemContainerStyle>
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Background="Transparent">
                                        <TextBlock Text="{Binding TheText}" />
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </Grid.ToolTip>

また、データ定義を次のように変更します。

public class Item
{
    public string TheText { get; set; }
    public IList<Item> TheWholeList { get; set; }
}

        var tmp = new List<Item>
        {
             .........
        };

        foreach (var it in tmp)
            it.TheWholeList = tmp;

        this.DataContext = tmp;

ツールチップのリストボックスで幅の制約をコメントアウトしたことに注意してください。これにより、切り捨てられていない要素の切り捨てられていないリストが表示されます。

編集#2:

<StackPanel Orientation="Horizontal">
    <ListBox x:Name="listbox" ItemsSource="{DynamicResource blah}">   // <---- HERE
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="Width" Value="250" />
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="Transparent">
                    <TextBlock Text="{Binding TheText}" TextTrimming="CharacterEllipsis" />

                    <Grid.ToolTip>
                        <ToolTip DataContext="{DynamicResource blah}">   // <---- HERE
                            <TextBlock Text="{Binding [2].TheText}" />   // <---- just example of binding to a one specific item
                            <!-- <ListBox ItemsSource="{Binding}">  another eaxmple: bind to whole list.. -->
                        </ToolTip>
                    </Grid.ToolTip>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>


public class Item
{
    public string TheText { get; set; }
}

    public MainWindow()
    {
        InitializeComponent();

        Resources["blah"] = new List<Item>   // <---- HERE
        {
            new Item { TheText = ........
             ........

最後の例では、window.DataContextバインディングをDynamicResourceへのバインディングに変更しました。ウィンドウの初期化では、データがウィンドウに渡される方法も変更しました。ツールチップテンプレートを変更して、ツールチップを明示的に含め、同じリソースにバインドしました。このようにして、内側のツールチップのテキストブロックはデータソースの3行目を直接読み取ることができます。これは、アイテムではなくリストにバインドされていることを証明します。

ただし、これはくだらないアプローチです。明示的なツールチップでのみ機能し、Tooltip.DataContext = resourceでのみ機能します。おそらく、このようなアプローチの唯一の機能です。おそらく、アタッチされた動作でツールチップにハッキングして、その親ウィンドウを検索することが可能です。バインディングを機能させることができますが、通常は価値がありません。2番目のサンプルのように、アイテムのプロパティにバインドしてみてください。

于 2012-08-22T08:08:07.263 に答える