WPF UserControl问题 - 调用VisibilityChanged事件但ControlTemplate的UIElements仍为空

时间:2017-04-18 06:25:38

标签: c# wpf user-controls

我需要在Windows 10上更改WPF comboBox背景。处理此问题的一个解决方案是从控件模板修改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;
    }

但是在调用VisibilityChanged事件时,toggleButton为null。 现在我通过计时器来解决。它很好但很脏。

有人可以提供任何建议吗?感谢。

1 个答案:

答案 0 :(得分:0)

ToggleButton折叠时,您无法获得对ComboBox的引用,因为它已从可见树中删除,因此没有ToggleButtonComboBox得到一个参考。

解决此问题的正确方法是覆盖XAML中ToggleButton / ComboBox的控件模板。

您可以在Visual Studio中以设计模式右键单击asyncio元素,然后选择&#34;编辑模板&#34;选项,然后&#34;编辑副本......&#34;选项将默认模板复制到XAML标记中,然后根据您的要求进行修改。这是比使用计时器更好的解决方案...有关此更多信息,请参阅以下链接。

在Windows 8上更改WPF中ComboBox的背景颜色: https://blog.magnusmontin.net/2014/04/30/changing-the-background-colour-of-a-combobox-in-wpf-on-windows-8/