我正在尝试将深色主题支持添加到我的爱好应用中。应用程序是WinForms,我不想在WPF中重写UI。因此,我改为尝试将几个WPF控件添加到我的应用中,主要是因为它们允许主题化滚动条。
我正在按照本教程托管控件:https://www.codeproject.com/Articles/739902/How-to-Easily-Host-WPF-Control-inside-Windows-Form
到目前为止,一切正常,除了无法动态更改WinForms中托管的WPF控件的背景颜色。我尝试了很多事情,改变了属性,调用了SetValue等,但是我可以控制Background / Foreground的唯一方法是直接在XAML中进行设置,这不是我想要的,因为我希望能够有选择地更改颜色。 / p>
这是我想象中最接近我想要的东西:
System.Windows.Style style = new System.Windows.Style();
style.TargetType = typeof(WpfControls.ListViewControl);
style.Setters.Add(new System.Windows.Setter(WpfControls.ListViewControl.BackgroundProperty, System.Windows.Media.Brushes.Pink));
style.Setters.Add(new System.Windows.Setter(WpfControls.ListViewControl.ForegroundProperty, System.Windows.Media.Brushes.Red));
this.listViewControl.Style = style;
答案 0 :(得分:0)
实际上,您的代码运行正常。您的ListViewControl
具有误导性,因为它是包含UserControl
控件的ListView
。您已正确地将样式应用于UserControl
,但是ListView
遮住了样式,因此您看不到更改。如果需要证明,可以使包含的ListView
的{{1}}透明。
要解决此问题,您可以在Background
中更改XAML,以便ListViewControl
从父容器获取其前景和背景。
ListView
...或...,因为您的意图也可能是修改样式中的许多其他属性,因此不必不必为每个样式都添加类似的绑定,因此可以引用包含的<ListView x:Name="listView" ItemsSource="{Binding ListEntries}" ScrollViewer.VerticalScrollBarVisibility="Visible"
Background="{Binding Parent.Background, RelativeSource={RelativeSource Self}}"
Foreground="{Binding Parent.Foreground, RelativeSource={RelativeSource Self}}">
</ListView>
控制并直接设置其样式。相反,请不要理会XAML,并将其添加到您的ListView
代码中:
Form1.cs
请注意:请确保您更改了System.Windows.Style style = new System.Windows.Style();
style.TargetType = typeof(System.Windows.Controls.ListView);
style.Setters.Add(new System.Windows.Setter(WpfControls.ListViewControl.BackgroundProperty, System.Windows.Media.Brushes.Pink));
style.Setters.Add(new System.Windows.Setter(WpfControls.ListViewControl.ForegroundProperty, System.Windows.Media.Brushes.Red));
//this.listViewControl.Style = style;
var listview = listViewControl.FindName ("listView") as System.Windows.Controls.ListView;
if (listview != null) {
listview.Style = style;
}
,它必须与TargetType
控件匹配才能起作用。