c# - 覆盖默认的 ComboBoxItem 颜色
问题描述
这可以覆盖 Xamarin Forms WPF 应用程序中的 ComboBoxItem 背景颜色,但不是很优雅,因为我必须在自定义渲染器中手动将模板应用到 ComboBoxItems:
Application.Resources 中的 App.xaml:
<ControlTemplate TargetType="{x:Type ComboBoxItem}" x:Key="CustomComboBoxItem">
<Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True">
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
<ControlTemplate.Triggers>
... All the regular triggers here override with new colors ...
</ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property='OverridesDefaultStyle' Value='True'/>
<Setter Property="Template" Value="{StaticResource CustomComboBoxItem}">
</Setter>
</Style>
在自定义 PickerRenderer 中:
protected override void UpdateNativeWidget()
{
base.UpdateNativeWidget();
var c = Control;
if (p == null)
{
template = System.Windows.Application.Current.Resources["CustomComboBoxItem"] as System.Windows.Controls.ControlTemplate;
ItemsPresenter presenter = GetVisualChild<ItemsPresenter>(c);
Popup p = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(c, 0), 0) as Popup;
var a = (((((p.Child) as Decorator).Child as Border).Child as ScrollViewer).Content as System.Windows.Controls.Grid).Children;
presenter = a[1] as ItemsPresenter;
this.p = presenter;
this.p.Loaded += Presenter_Loaded;
}
}
ItemsPresenter p;
ComboBoxItem[] items;
System.Windows.Controls.ControlTemplate template;
private void Presenter_Loaded(object sender, RoutedEventArgs e)
{
items = new ComboBoxItem[Control.ItemContainerGenerator.Items.Count];
for(int i=0;i<items.Length;i++)
{
items[i] = Control.ItemContainerGenerator.ContainerFromIndex(i) as ComboBoxItem;
if (template != null)
{
items[i].Template = template;
}
}
}
我不能执行以下操作,否则我会得到以下异常:
ArgumentException:已添加项目。字典中的键:'System.Windows.Controls.ComboBoxItem' 添加的键:'System.Windows.Controls.ComboBoxItem'
<ControlTemplate TargetType="{x:Type ComboBoxItem}" x:Key="{x:Type ComboBoxItem}">
</ControlTemplate>
或者这个,默认值不会被覆盖:
<ControlTemplate TargetType="{x:Type ComboBoxItem}" x:Key="CustomComboBoxItem">
</ControlTemplate>
<Style TargetType="{x:Type ComboBoxItem}" x:Key="{x:Type ComboBoxItem}">
<Setter Property='OverridesDefaultStyle' Value='True'/>
<Setter Property="Template" Value="{StaticResource CustomComboBoxItem}">
</Setter>
</Style>
有没有更简单、更优雅的方式来做我想做的事情?
解决方案
如果您想将整个应用程序中的默认comBoxItem 模板设置为customComboxItem。您只需将样式资源放在 app.xaml 中。
<Application.Resources>
<Style TargetType="{x:Type ComboBoxItem}" x:Key="{x:Type ComboBoxItem}">
<Setter Property='OverridesDefaultStyle' Value='True'/>
<Setter Property="Template" Value="{StaticResource CustomComboBoxItem}">
</Setter>
</Style>
</Application.Resources>
推荐阅读
- azure-application-insights - On Prem IIS 和 Azure Application Insight
- powerbi - PowerBI 中的 Sumif 等效项不能与 DAX 函数一起正常工作
- spring-security - 是否可以使用自定义的 ServerAuthenticationEntryPoint 添加响应正文?
- php - PHP preg_match 不接受换行符
- visual-studio-code - 如何杀死 Ubuntu 主机上的 VSCode 远程服务
- python - XML 换行符实体和 Python 编码
- apache - 如何在 Apache 中使用代理引擎重定向到映射到其他主机的其他子域?
- r - 使用双 for 循环创建新变量的函数
- c++ - 如何使用 WinRT 创建经典的 win32 应用程序窗口?
- ios - 如何使用 swift 链接实现 GPUImage 过滤器?