创建继承ComboBox的WPF自定义控件报错,请求排查解决
解决WPF自定义ComboBox控件的InvalidCastException错误
嘿,我来帮你排查这个WPF控件的错误问题~你遇到的InvalidCastException: Unable to cast object of type 'System.Windows.Controls.ControlTemplate' to type 'System.Windows.Style',原因其实很明确:
WPF默认会把以{x:Type ComboBox}作为Key的资源当作Style来加载,但你直接把ControlTemplate绑定到了这个Key上。当你的自定义ComboBox控件试图加载自身的默认样式时,它拿到的是一个ControlTemplate对象,自然就会抛出类型转换失败的异常。
下面给你两种可行的解决方法:
方法一:给ControlTemplate设置独立Key,显式绑定Template属性
修改你的XAML代码,给ControlTemplate一个自定义的Key,然后直接在ComboBox标签里通过Template属性引用它,这样WPF就不会混淆资源类型了:
<ComboBox x:Class="Pesticide.CustomUserControls.ComboxUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Pesticide.CustomUserControls" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" Template="{StaticResource CustomComboBoxTemplate}"> <ComboBox.Resources> <ControlTemplate TargetType="{x:Type ComboBox}" x:Key="CustomComboBoxTemplate"> <Grid> <!-- 这里可以添加你的自定义模板布局内容 --> </Grid> </ControlTemplate> </ComboBox.Resources> </ComboBox>
方法二:在Style中嵌套ControlTemplate,使用{x:Type ComboBox}作为Style的Key
如果你希望这个自定义模板成为该控件的默认样式,可以把ControlTemplate放在Style里面,然后将Style的Key设置为{x:Type ComboBox},这样WPF加载默认样式时就能正确识别:
<ComboBox x:Class="Pesticide.CustomUserControls.ComboxUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Pesticide.CustomUserControls" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <ComboBox.Resources> <Style TargetType="{x:Type ComboBox}" x:Key="{x:Type ComboBox}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ComboBox}"> <Grid> <!-- 自定义模板布局内容 --> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ComboBox.Resources> </ComboBox>
另外,你的后台代码不需要做任何修改,保持原来的实现就可以啦。
内容的提问来源于stack exchange,提问作者Melon NG
相关产品推荐
相关产品推荐

