1

多くのアイテムを含むリストボックスがあります。項目にカーソルを合わせると、かなり「重い」ポップアップを表示する必要があります。各アイテムのポップアップをロードするのはリソースの無駄だと確信しているので、アイテムにカーソルを合わせたときにのみ、アイテム内の ContentControl のテンプレートを変更してポップアップを含めます。これは私がこれまでに持っているものです: (簡易版) (このコードは Kaxaml に貼り付けることができます)

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources> 

    <ControlTemplate x:Key="WithPopup" TargetType="ContentControl">
      <Grid>
        <ContentPresenter Content="{TemplateBinding Content}" Name="Target" />
        <Popup PlacementTarget="{Binding ElementName=Target}" IsOpen="True" >
            <Border BorderBrush="Red" BorderThickness="1" Background="Pink"> 
                <TextBlock Text="I'd like this to behave like a Popup - not a tooltip!" Margin="10" /> 
            </Border> 
        </Popup> 
      </Grid>
    </ControlTemplate>   
  </Page.Resources>
  <Grid Height="20" Margin="50,50,0,0" Name="ParentGrid">  
    <ContentControl>
      <TextBlock x:Name="TargetControl" Text="Hover over me!"  /> 
      <ContentControl.Style>
        <Style TargetType="ContentControl">
          <Style.Triggers>
            <DataTrigger Binding="{Binding IsMouseOver, ElementName=TargetControl}" Value="True">
              <Setter Property="Template" Value="{StaticResource WithPopup}" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </ContentControl.Style>
    </ContentControl>
  </Grid>
</Page>

問題は、ポップアップを MouseOver しようとすると、マウスが元の ControlTemplate を離れているため (ツールチップのように) 消えてしまうことです。これにより、ポップアップのあるテンプレートが消えます。何か案は? 編集:これを達成するためにコードビハインドも利用できます(xamlの方が好きですが)

4

2 に答える 2

3

解決策 (少なくともその一部) だと思うものがあります。トリガーを介して ContentControl のテンプレートを変更する代わりに、トリガーを使用してポップアップのコンテンツを変更するとうまくいくようです。そのため、アイテムごとに大きなビジュアル ツリーを含む複雑なポップアップをロードする代わりに、アイテムごとにコンテンツを持たない単純なポップアップをロードし、ContentControl を MouseEnter したときにのみそのコンテンツを入力します。そのようです:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <DataTemplate x:Key="popupContent" DataType="{x:Type ContentControl}">
      <Border BorderBrush="Red" BorderThickness="1" Background="Pink"> 
          <TextBlock Text="This is behaving like a Popup now!" Margin="10" /> 
      </Border>
    </DataTemplate>

    <ControlTemplate x:Key="WithPopup" TargetType="ContentControl">
      <Grid Name="popupGrid">
        <TextBlock Text="Hover over me!"  />
        <Popup IsOpen="True" > 
            <ContentControl Name="content" />
        </Popup> 
      </Grid>
      <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding IsMouseOver, ElementName=popupGrid}" Value="True"> 
          <Setter Property="ContentTemplate" Value="{StaticResource popupContent}"  TargetName="content" />
        </DataTrigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>

  </Page.Resources>
  <Grid Height="20" Width="100" HorizontalAlignment="Left" Margin="50,50,0,0">  
    <ContentControl Template="{StaticResource WithPopup}" />
  </Grid>
</Page>

この方法を使用してパフォーマンスがどれだけ向上するかを測定する方法はよくわかりませんが、理にかなっていると思います。私はまだ他のより良いアイデアを聞きたいです。ありがとう。

于 2012-04-27T13:48:07.347 に答える
0

少し違ったことをする必要があります - 次のようなことを試してください:

<ContentControl Content="hover over me!">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock x:Name="TargetControl" Text="{TemplateBinding Content}"  />
                <Popup PlacementTarget="{Binding ElementName=Target}" x:Name="popup">
                    <Border BorderBrush="Red" BorderThickness="1" Background="Pink">
                        <TextBlock Text="I'd like this to behave like a Popup - not a tooltip!" Margin="10" />
                    </Border>
                </Popup>
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, ElementName=TargetControl}" Value="True">
                    <Setter TargetName="popup" Property="IsOpen" Value="true" />
                </DataTrigger>
                <DataTrigger Binding="{Binding IsMouseOver, ElementName=popup}" Value="true">
                    <Setter TargetName="popup" Property="IsOpen" Value="true" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>
于 2012-04-27T08:51:51.540 に答える