C# WPF UserControl问题-调用VisibilityChanged事件,但ControlTemplate的UIElements仍然为null
我需要在Windows10上更改WPF组合框背景。处理此问题的一个解决方案是修改控件模板中的border.Background 代码片段如下所示C# WPF UserControl问题-调用VisibilityChanged事件,但ControlTemplate的UIElements仍然为null,c#,wpf,user-controls,C#,Wpf,User Controls,我需要在Windows10上更改WPF组合框背景。处理此问题的一个解决方案是修改控件模板中的border.Background 代码片段如下所示 private void ChangeBackground(object sender) { var osInfo = System.Environment.OSVersion; // Version > Windows 7 (6.1) ? // https://msdn.micro
private void ChangeBackground(object sender)
{
var osInfo = System.Environment.OSVersion;
// Version > Windows 7 (6.1) ?
// https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms724832(v=vs.85).aspx
if (osInfo.Version.Major < 6 || osInfo.Version.Minor < 2) return;
var comboBox = sender as ComboBox;
if (comboBox == null) return;
var comboBoxTemplate = comboBox.Template;
if (comboBoxTemplate == null) return;
var toggleButton = comboBoxTemplate.FindName("toggleButton", comboBox) as ToggleButton;
if (toggleButton == null) return;
var toggleButtonTemplate = toggleButton.Template;
var border = toggleButtonTemplate.FindName("templateRoot", toggleButton) as Border;
if (border == null) return;
// IsEnable?
border.Background = (((ComboBox)(sender)).IsEnabled == false)
? (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF0F0F0"))
: comboBox.Background;
}
private void changebackup(对象发送方)
{
var osInfo=System.Environment.OSVersion;
//版本>Windows 7(6.1)?
// https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms724832(v=vs.85).aspx
if(osInfo.Version.Major<6 | | osInfo.Version.Minor<2)返回;
var comboBox=发送方作为组合框;
if(comboBox==null)返回;
var comboBoxTemplate=comboBox.Template;
if(comboBoxTemplate==null)返回;
var toggleButton=comboBoxTemplate.FindName(“toggleButton”,comboBox)作为toggleButton;
if(toggleButton==null)返回;
var togglebuttonemplate=toggleButton.Template;
var border=togglebuttonemplate.FindName(“templateRoot”,toggleButton)作为边框;
if(border==null)返回;
//这是合理的吗?
border.Background=((组合框)(发送方)).IsEnabled==false)
?(SolidColorBrush)(新的BrushConverter().ConvertFrom(“#fff0”))
:组合框。背景;
}
但是调用VisibilityChanged事件时,toggleButton为null。
现在我用定时器工作。它工作很好,但很脏
有人能提供一些建议吗?谢谢。当
组合框
折叠时,您将无法获取对切换按钮
的引用,因为该组合框随后将从可视树中删除,因此没有切换按钮
可获取引用
解决此问题的正确方法是重写XAML中的组合框
/切换按钮
的控件模板
您可以在Visual Studio的设计模式中右键单击组合框
元素,选择“编辑模板”选项,然后选择“编辑副本…”选项,将默认模板复制到XAML标记中,然后根据需要修改它。这是一种比使用计时器更好的解决方案…请参阅以下链接了解更多信息
在Windows 8上更改WPF中组合框的背景色:我不建议您熟悉MVVM模式和IValueConverter的使用。当您使用正确的模式而不是代码隐藏解决方案时,这样的问题不再是问题了。实际上,我使用MVVM模式来编写程序。我不知道如何使用IValueConverter来解决这个问题。无论如何谢谢你的回复。谢谢mm8,你提供了一个关于切换按钮行为的很好的解释。但是我不想覆盖ComboBox的控件模板。我使用UserControl保存代码以便于维护。这样您就无法更改折叠组合框的背景。就这么简单。