WinRT - 创建具有特定 ItemContainerStyle 的自定义 ListView 控件
WinRT - Create a custom ListView control with specific ItemContainerStyle
我为 Windows Phone 8.1 创建了一个 WinRT class 库可重用 UI 控件。现在,我想创建一个默认 ItemContainerStyle
的自定义 ListView
控件。这样,我就不需要在所有不同的项目中设置 ItemContainerStyle。
所以,我创建了两个文件:
- a
CustomListView
class 继承自 ListView
- 具有
CustomListViewItemStyle
样式、目标类型 ListViewItem
的 CustomListView.xaml
资源字典。此文件将合并到 Themes/generic.xaml
资源字典中。
在 CustomListView 的构造函数中,我设置了 ItemContainerStyle:
ItemContainerStyle = Resources["CustomListViewItemStyle"] as Style;
这不起作用,我收到以下错误:WinRT 信息:找不到具有给定密钥的资源。
此外,将样式从我的自定义资源字典移动到 generic.xaml
也无济于事。
我做错了什么?
编辑
我的Themes/Generic.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XYZ.Apps.UI">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/TabPanel/TabPanel.xaml" />
<ResourceDictionary Source="/CustomListView/CustomListView.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
它没有找到应用范围内的资源。试试这个
App.Current.Resources["CustomListViewItemStyle"] as Style
我明白你想要什么。作为后续示例,如果控制团队将 HorizontalContentAlignment 默认为 Stretch 而不是像现在这样的 Left,我会很高兴。创建 CustomListView 可以做到这一点。
首先,让我们谈谈您当前的方法。简而言之,完美。但是对于模板化控件,您可能有一些不了解的地方,那就是 generic.xaml 中的样式是自动应用的,如果您在样式中进行设置,则无需在代码隐藏中设置样式。
希望你有这样的东西:
<Style Target='ListView'>
<Setter Property='ItemContainerStyle'>
<Setter.Value>
<Style Target='ListViewItem'>
<Setter Property='HorizontalContentAlignment' Value='Stretch' />
</Style>
</Setter.Value>
</Setter>
</Style>
当然,这只是快速输入而不是精确的语法,但希望您能理解它。上面的代码将放在 themes/generic.xaml 中,平台将在应用程序、页面或控件(按该顺序)范围内的任何内容之前应用此代码。
记得
- 只有一个 Target=ListView 样式
- 在这种情况下不包括 x:Key
这行得通。我可以验证这一点,因为我这样做了。
现在,回答你的问题。为什么你的不工作?我对你的为什么不起作用的想法是因为它没有正确地合并到 generic.xaml 中。作为快速测试,采用您的样式并将其手动复制到 generic.xaml。看看是否有效。如果是,那么您的合并语法就是问题所在。
在没有更多信息的情况下,这是我对你的问题所能做的最好的调试。值得告诉你这是有效的。我想这就是你需要继续的希望。您的问题可能出在一些细微的语法错误或合并中,我不确定。但你会明白的。
祝你好运。
我为 Windows Phone 8.1 创建了一个 WinRT class 库可重用 UI 控件。现在,我想创建一个默认 ItemContainerStyle
的自定义 ListView
控件。这样,我就不需要在所有不同的项目中设置 ItemContainerStyle。
所以,我创建了两个文件:
- a
CustomListView
class 继承自ListView
- 具有
CustomListViewItemStyle
样式、目标类型ListViewItem
的CustomListView.xaml
资源字典。此文件将合并到Themes/generic.xaml
资源字典中。
在 CustomListView 的构造函数中,我设置了 ItemContainerStyle:
ItemContainerStyle = Resources["CustomListViewItemStyle"] as Style;
这不起作用,我收到以下错误:WinRT 信息:找不到具有给定密钥的资源。
此外,将样式从我的自定义资源字典移动到 generic.xaml
也无济于事。
我做错了什么?
编辑
我的Themes/Generic.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XYZ.Apps.UI">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/TabPanel/TabPanel.xaml" />
<ResourceDictionary Source="/CustomListView/CustomListView.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
它没有找到应用范围内的资源。试试这个
App.Current.Resources["CustomListViewItemStyle"] as Style
我明白你想要什么。作为后续示例,如果控制团队将 HorizontalContentAlignment 默认为 Stretch 而不是像现在这样的 Left,我会很高兴。创建 CustomListView 可以做到这一点。
首先,让我们谈谈您当前的方法。简而言之,完美。但是对于模板化控件,您可能有一些不了解的地方,那就是 generic.xaml 中的样式是自动应用的,如果您在样式中进行设置,则无需在代码隐藏中设置样式。
希望你有这样的东西:
<Style Target='ListView'>
<Setter Property='ItemContainerStyle'>
<Setter.Value>
<Style Target='ListViewItem'>
<Setter Property='HorizontalContentAlignment' Value='Stretch' />
</Style>
</Setter.Value>
</Setter>
</Style>
当然,这只是快速输入而不是精确的语法,但希望您能理解它。上面的代码将放在 themes/generic.xaml 中,平台将在应用程序、页面或控件(按该顺序)范围内的任何内容之前应用此代码。
记得
- 只有一个 Target=ListView 样式
- 在这种情况下不包括 x:Key
这行得通。我可以验证这一点,因为我这样做了。
现在,回答你的问题。为什么你的不工作?我对你的为什么不起作用的想法是因为它没有正确地合并到 generic.xaml 中。作为快速测试,采用您的样式并将其手动复制到 generic.xaml。看看是否有效。如果是,那么您的合并语法就是问题所在。
在没有更多信息的情况下,这是我对你的问题所能做的最好的调试。值得告诉你这是有效的。我想这就是你需要继续的希望。您的问题可能出在一些细微的语法错误或合并中,我不确定。但你会明白的。
祝你好运。