itemstemplate 周围的 Scrollviewer 拾取了错误的 itemstemplate
Scrollviewer around itemstemplate picking up wrong itemstemplate
我需要一个围绕 ItemsControl 的滚动查看器,其 ItemsPaneltemplate 取决于 属性 IsClusterSupported。
没有 ScrollViewer,ItemsControl 总是显示正确的 ItemsPanel,但是当我添加 scrollviewer 代码时,即使 IsClusterSupported=False 也会显示 ClusterMapItemsPanelTemplate。
这里可能发生了什么问题?我附上了下面的代码。
<Grid Name="MapGrid">
<ScrollViewer>
<ScrollViewer.Style>
<Style TargetType="{x:Type ScrollViewer}">
<Setter Property="VerticalScrollBarVisibility" Value="Hidden"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsScrollingSupported}" Value="True">
<Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ScrollViewer.Style>
<ItemsControl Name="ItemsControlInnerMap" Loaded="ItemsControlInnerMap_Loaded"
ItemsSource="{Binding ItemsCol}" Tag="{Binding IsClusterSupported, PresentationTraceSources.TraceLevel=High}">
<ItemsControl.Style>
<Style TargetType="{x:Type ItemsControl}">
<Setter Property="ItemsPanel" Value="{StaticResource MapItemsPanelTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsClusterSupported}" Value="True">
<Setter Property="ItemsPanel" Value="{StaticResource ClusterMapItemsPanelTemplate}"/>
<Setter Property="ItemContainerStyle" Value="{StaticResource ClusterMapGridContainerStyle}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border>
<TextBlock Text="{Binding LabelTxt}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.GroupStyle>
<GroupStyle x:Name="MyGroup">
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Name="BD" BorderBrush="Black" BorderThickness="2">
<ItemsPresenter Name="ClusterPresenter" Tag="{Binding Name}"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Name, Converter={StaticResource BorderVisibilityConvertor}}" Value="false">
<Setter TargetName="BD" Property="BorderBrush" Value="Transparent"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<!--
<Setter Property="Grid.Row" Value="{Binding Items[0].ClusterGridRow}"/>
<Setter Property="Grid.Column" Value="{Binding Items[0].ClusterGridColumn}"/>
<Setter Property="Margin" Value="5"/>
</Style>
</GroupStyle.ContainerStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Loaded="ClusterMapGrid_Loaded"
MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}"
MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}">
</Grid>ReqMinHeight
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</ItemsControl.GroupStyle>
</ItemsControl>
</ScrollViewer>
</Grid>
RDV(01/04/2016):我在这里发现了一些有趣的东西,希望能更接近解决方案,但仍然需要帮助。
我所有的绑定都工作正常;我在不使用 scrollviewer 的情况下进行了调试,并在 ItemsControl 中看到了正确的 ItemsPanel。 ItemsControl 的 IsGrouping 属性 也设置正确。
当我在 ItemsControl 周围有一个滚动查看器时,ClusterMapGrid(GroupStyle.Panel)会被加载,而不管我是否有集群。加载后,将不会加载非群集模板 (MapsItemsPanelTemplate)。
为了解决这个问题,我尝试将 ClusterMapGrid 可见性绑定到 ItemsControl 的 IsGrouping 属性,但在滚动查看器的情况下又以某种方式加载了 ClusterMapGrid,一旦加载,非集群模板就会失败加载.
我使用 snoop 检查 ClusterMapGrid 的可见性,我可以看到它已折叠,但如果在 snoop 中手动将其更改为任何其他值,非集群模板加载并且一切正常。我尝试在 ClusterMapGrid_Loaded 事件中将可见性设置为折叠,但它也没有帮助。
进一步调试我发现 ScrollViewer 正在加载其中的所有项目 - 因此 ClusterMapGrid 被加载,一旦我使用 Snoop 更改可见性,它就会在非集群情况下被卸载。
问题陈述:如何在加载 ClusterMapGrid 后卸载它,我知道这是一个非集群场景。
问题是 ScrollViewer 会初始化并加载 XAML 中的所有内容,即使它不打算加载(例如,如果 ItemsControl 上的 IsGrouping 为真,则应该加载 GroupStyle.Panel,但是scrollviewer,无论如何它正在加载)。
解决方案:将XAML中的GroupStyle.Panel注释掉,并将其添加为Resources中的ItemsPanelTemplate:
<ItemsPanelTemplate x:Key="ClusterPanelTemplate">
<Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Loaded="ClusterMapGrid_Loaded"
MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}"
MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}"/>
</ItemsPanelTemplate>
在 ItemsControlInnerMap_Loaded 事件 code-behind 中添加以下内容:
private void ItemsControlInnerMap_Loaded(object sender, RoutedEventArgs e)
{
if ((sender as ItemsControl).IsGrouping)
{
(sender as ItemsControl).GroupStyle[0].Panel = (ItemsPanelTemplate)this.FindResource("ClusterPanelTemplate");
}
else
{
(sender as ItemsControl).GroupStyle.Clear();
}
}
我需要一个围绕 ItemsControl 的滚动查看器,其 ItemsPaneltemplate 取决于 属性 IsClusterSupported。 没有 ScrollViewer,ItemsControl 总是显示正确的 ItemsPanel,但是当我添加 scrollviewer 代码时,即使 IsClusterSupported=False 也会显示 ClusterMapItemsPanelTemplate。
这里可能发生了什么问题?我附上了下面的代码。
<Grid Name="MapGrid">
<ScrollViewer>
<ScrollViewer.Style>
<Style TargetType="{x:Type ScrollViewer}">
<Setter Property="VerticalScrollBarVisibility" Value="Hidden"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsScrollingSupported}" Value="True">
<Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ScrollViewer.Style>
<ItemsControl Name="ItemsControlInnerMap" Loaded="ItemsControlInnerMap_Loaded"
ItemsSource="{Binding ItemsCol}" Tag="{Binding IsClusterSupported, PresentationTraceSources.TraceLevel=High}">
<ItemsControl.Style>
<Style TargetType="{x:Type ItemsControl}">
<Setter Property="ItemsPanel" Value="{StaticResource MapItemsPanelTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsClusterSupported}" Value="True">
<Setter Property="ItemsPanel" Value="{StaticResource ClusterMapItemsPanelTemplate}"/>
<Setter Property="ItemContainerStyle" Value="{StaticResource ClusterMapGridContainerStyle}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border>
<TextBlock Text="{Binding LabelTxt}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.GroupStyle>
<GroupStyle x:Name="MyGroup">
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Name="BD" BorderBrush="Black" BorderThickness="2">
<ItemsPresenter Name="ClusterPresenter" Tag="{Binding Name}"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Name, Converter={StaticResource BorderVisibilityConvertor}}" Value="false">
<Setter TargetName="BD" Property="BorderBrush" Value="Transparent"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<!--
<Setter Property="Grid.Row" Value="{Binding Items[0].ClusterGridRow}"/>
<Setter Property="Grid.Column" Value="{Binding Items[0].ClusterGridColumn}"/>
<Setter Property="Margin" Value="5"/>
</Style>
</GroupStyle.ContainerStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Loaded="ClusterMapGrid_Loaded"
MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}"
MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}">
</Grid>ReqMinHeight
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</ItemsControl.GroupStyle>
</ItemsControl>
</ScrollViewer>
</Grid>
RDV(01/04/2016):我在这里发现了一些有趣的东西,希望能更接近解决方案,但仍然需要帮助。
我所有的绑定都工作正常;我在不使用 scrollviewer 的情况下进行了调试,并在 ItemsControl 中看到了正确的 ItemsPanel。 ItemsControl 的 IsGrouping 属性 也设置正确。
当我在 ItemsControl 周围有一个滚动查看器时,ClusterMapGrid(GroupStyle.Panel)会被加载,而不管我是否有集群。加载后,将不会加载非群集模板 (MapsItemsPanelTemplate)。
为了解决这个问题,我尝试将 ClusterMapGrid 可见性绑定到 ItemsControl 的 IsGrouping 属性,但在滚动查看器的情况下又以某种方式加载了 ClusterMapGrid,一旦加载,非集群模板就会失败加载.
我使用 snoop 检查 ClusterMapGrid 的可见性,我可以看到它已折叠,但如果在 snoop 中手动将其更改为任何其他值,非集群模板加载并且一切正常。我尝试在 ClusterMapGrid_Loaded 事件中将可见性设置为折叠,但它也没有帮助。
进一步调试我发现 ScrollViewer 正在加载其中的所有项目 - 因此 ClusterMapGrid 被加载,一旦我使用 Snoop 更改可见性,它就会在非集群情况下被卸载。
问题陈述:如何在加载 ClusterMapGrid 后卸载它,我知道这是一个非集群场景。
问题是 ScrollViewer 会初始化并加载 XAML 中的所有内容,即使它不打算加载(例如,如果 ItemsControl 上的 IsGrouping 为真,则应该加载 GroupStyle.Panel,但是scrollviewer,无论如何它正在加载)。
解决方案:将XAML中的GroupStyle.Panel注释掉,并将其添加为Resources中的ItemsPanelTemplate:
<ItemsPanelTemplate x:Key="ClusterPanelTemplate">
<Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Loaded="ClusterMapGrid_Loaded"
MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}"
MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}"/>
</ItemsPanelTemplate>
在 ItemsControlInnerMap_Loaded 事件 code-behind 中添加以下内容:
private void ItemsControlInnerMap_Loaded(object sender, RoutedEventArgs e)
{
if ((sender as ItemsControl).IsGrouping)
{
(sender as ItemsControl).GroupStyle[0].Panel = (ItemsPanelTemplate)this.FindResource("ClusterPanelTemplate");
}
else
{
(sender as ItemsControl).GroupStyle.Clear();
}
}