gpt4 book ai didi

c# - 如何创建可重用、上下文无关的 XAML 代码块?

转载 作者:行者123 更新时间:2023-11-30 16:44:55 25 4
gpt4 key购买 nike

在下面的 WPF ListView , 我创建了两个 ContextMenus :一个用于 ListView 本身,一个用于每个特定的列表项。它看起来有点像这样:

<ListView ItemsSource="{Binding Path=MyListData}">
<ListView.ContextMenu>
<ContextMenu> <!-- menu for the entire list -->
<MenuItem Header="New Item"/>
<MenuItem Header="Sort by">
<MenuItem Header="Name"/>
<MenuItem Header="Author"/>
<MenuItem Header="Date"/>
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu> <!-- menu for a specific item -->
<MenuItem Header="Edit"/>
<MenuItem Header="Remove"/>
<Separator/> <!-- note how the following is basically the same as the other menu -->
<MenuItem Header="New Item"/>
<MenuItem Header="Sort by">
<MenuItem Header="Name"/>
<MenuItem Header="Author"/>
<MenuItem Header="Date"/>
</MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<!-- ListView content -->
</ListView.View>
</ListView>

这是有效的,但如您所见,第一个上下文菜单的内容被重新用作第二个上下文菜单的一部分。这是因为我希望当用户右键单击某个项目而不是空白区域时,常规选项(新项目/排序依据)也可用。由于我计划不止一次地使用这个通用结构,我可以想象这会变得相当困惑,尤其是当所有必要的命令绑定(bind)都被考虑在内时。

我尝试定义一个 DataTemplate<ListView.Resources>正如类似问题的答案中所解释的那样,但这行不通,因为显然是独立的 MenuItem s 不能包装在模板中。如果我包括 <ContextMenu>模板中的标记,存在运行时异常,因为 ContextMenu不能住在另一个ContextMenu .

有什么方法可以创建通常需要特定父元素的可重用代码片段吗?在编译时评估的某种模板?我想要的只是更易于维护的代码。

最佳答案

你可以这样做:

<Window.Resources>
<MenuItem x:Key="newItem" Header="New Item" Command="{x:Static ApplicationCommands.New}" x:Shared="False" />
<MenuItem x:Key="sortBy" Header="Sort by" x:Shared="False">
<MenuItem Header="Name" Click="SortByNameClicked"/>
<MenuItem Header="Author"/>
<MenuItem Header="Date"/>
</MenuItem>
</Window.Resources>
<ListView ItemsSource="{Binding Path=MyListData}">
<ListView.ContextMenu>
<ContextMenu>
<!-- menu for the entire list -->
<StaticResource ResourceKey="newItem" />
<StaticResource ResourceKey="sortBy" />
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<!-- menu for a specific item -->
<MenuItem Header="Edit"/>
<MenuItem Header="Remove"/>
<Separator/>
<StaticResource ResourceKey="newItem" />
<StaticResource ResourceKey="sortBy" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>

注意 x:Shared="false" 属性。它所做的是使对该资源的每个引用都创建新副本。默认情况下,相同的资源实例会被重用,但这不适合我们的场景,因为我们需要为不同的菜单提供不同的实例(否则它会提示同一个项目不能是多个父项的子项)。

您可以像往常一样在此类项目上定义命令绑定(bind)和单击事件(如您所见)。

关于c# - 如何创建可重用、上下文无关的 XAML 代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com