Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF UserControl问题-调用VisibilityChanged事件,但ControlTemplate的UIElements仍然为null_C#_Wpf_User Controls - Fatal编程技术网

C# WPF UserControl问题-调用VisibilityChanged事件,但ControlTemplate的UIElements仍然为null

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

我需要在Windows10上更改WPF组合框背景。处理此问题的一个解决方案是修改控件模板中的border.Background

代码片段如下所示

    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保存代码以便于维护。这样您就无法更改折叠组合框的背景。就这么简单。