2012-04-26 55 views
0

我有一个包含许多项目的列表框。当我将鼠标悬停在某个项目上时,我需要显示一个相当“重”的弹出窗口。我敢肯定,加载每个项目的弹出窗口是浪费资源,所以我想只有当我将鼠标悬停在项目上时,我修改了项目中的ContentControl模板以包含Popup。这是我到目前为止有:(简化版)(此代码可以被粘贴到Kaxaml)使用触发器更改ContentControl的模板

<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> 

的问题是,当我尝试将鼠标悬停弹出 - 消失(如提示),因为我我是鼠标正在离开原来的ControlTemplate - 这会导致带有Popup的模板消失。有任何想法吗? 编辑:我可以及实现这一目标(尽管我宁愿XAML)

回答

1

我有我认为是(至少部分)解决方案: 而不是通过触发器更改ContentControl的模板,使用触发器更改弹出的 内容似乎工作。因此,我没有为每个项目加载一个带有大型可视化树的复杂Popup,而是为每个项目加载了一个没有内容的简单Popup,并且只在我输入ContentControl时填充该内容。像这样:

<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> 

我不太清楚如何来衡量我会有多大提高性能,明智的使用这种方法,但我认为这似乎是有道理的。我仍然想听听其他更好的想法。 谢谢。

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> 
+0

嗨,Dean,谢谢你的回答,但是我正在寻找一个解决方案,我不必为每个项目加载弹出窗口 - 只对于鼠标悬停的项目。在你的解决方案 - 弹出窗口被加载 - 只是不可见 – Danield 2012-04-27 10:27:13