2012-04-26 40 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