重设WinForm应用中托管的WPF控件的样式

时间:2018-07-26 17:46:12

标签: wpf winforms elementhost

我正在尝试将深色主题支持添加到我的爱好应用中。应用程序是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;

颜色不变。代码在这里:https://github.com/TheIronWolfModding/WpfControlsWinFormsHost/blob/master/WindowsFormsHost_Test/Form1.cs

1 个答案:

答案 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控件匹配才能起作用。