将资源中的样式应用到 ListView.ItemContainerStyle。

6
我正在使用VS 2012中的XAML/WPF。我承认我还不太理解模板和样式。

我在我的application.xaml文件中定义了一个样式,像这样:

<Style x:Key="ContactGroups" TargetType="ListViewItem">
    <!-- Styling omitted here -->
</Style>

现在我想将这种样式应用到我的列表视图中,但我无法弄清楚在哪里应用这种样式,即在哪里放置设置样式的代码。为了保持简洁,我省略了很多属性。
<ListView ItemsSource="{Binding Groups}" SelectedItem="{Binding Path=SelectedGroup, Mode=OneWayToSource}" >
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Width="140" Height="25">
                <Grid.RowDefinitions>
                    <RowDefinition Height="2*" />
                </Grid.RowDefinitions>
                <Label Content="{Binding Name}" ToolTip="{Binding Name}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
2个回答

11

使用StaticResource标记扩展,在ListBox的ItemContainerStyle上设置样式:

<ListView ItemsSource="{Binding Groups}"
          SelectedItem="{Binding Path=SelectedGroup, Mode=OneWayToSource}"
          ItemContainerStyle="{StaticResource ContactGroups}" >

运行和编译没有错误,但是我的样式没有被应用。我真的很困惑为什么会这样。当获取正在使用的颜色的十六进制,并在我的 XAML(或整个应用程序)中搜索它们时,这些颜色没有出现在任何地方。我怀疑你的答案是正确的,而我有其他问题。 - HK1
是的,针对您所发布的问题,这是实现它的方法。不确定您的其他问题。 - Rohit Vats
考虑开一个新问题,详细说明你的需求,这样更多的人可以看到并提供帮助。 - Rohit Vats
我认为这可能是Win 8.x的一个bug。请看我的新帖子:http://stackoverflow.com/questions/21686509/wpf-ff-color-bug-on-windows-8-1-visual-studio-2012 - HK1

1
我不确定您是否只想将此样式应用于此列表,但如果不是,您可以从样式中删除x:Key="ContactGroups",那么它将应用于所有列表项。
如果您只想针对此列表视图进行操作,则可以将样式添加到列表视图的资源中。
    <ListView ItemsSource="{Binding Groups}" SelectedItem="{Binding Path=SelectedGroup, Mode=OneWayToSource}" >
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <!-- Styling omitted here -->
            </Style>
        </ListView.Resources>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="140" Height="25">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="2*" />
                    </Grid.RowDefinitions>
                    <Label Content="{Binding Name}" ToolTip="{Binding Name}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

编辑:根据您下面的评论,这可能是您想要采取的方法:

<ListView.Resources>
    <Style TargetType="ListViewItem" BasedOn="{StaticResource ContactGroups}" />
</ListView.Resources>

这样您的样式就会在App.xaml中保持定义。

谢谢,我认为这实际上可能会指引我朝着正确的方向。我想知道是否还有其他“全局”样式被应用于我的列表,导致我在上面的评论中提到的问题。感谢您建议使用本地资源。实际上,我正在尝试将我的样式从xaml窗口中移出,因为该窗口已变得过于复杂和难以阅读。 - HK1
明白了。在这种情况下,我还有一个你可能更喜欢的选项。我会将其添加在上面。 - TrueEddie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接