在wpf中应用样式时,用户控件内的组合框消失

时间:2010-09-07 11:45:19

标签: wpf wpf-controls

我正在尝试将样式应用于组合框但是不是应用组合框本身就会消失。请检查以下xaml代码以获取用户控制权。

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna" 
    x:Class="Guardian.PAS.PASFramework.UI.WPF.PASComboBox"
    xmlns:local="clr-namespace:Guardian.PAS.PASFramework.UI.WPF"
    Height="26" Width="100" VerticalAlignment="Center" >
    <UserControl.Resources>
        <Style x:Key="comboBoxStyle" TargetType="{x:Type local:PASCustomComboBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:PASCustomComboBox}">
                        <ControlTemplate.Triggers>
                            <Trigger Property="local:PASCustomComboBox.IsEnabled" Value="false">
                                <Setter Property="Background" Value="Red"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <Canvas Name="canvas" Height="23" Width="Auto" VerticalAlignment="Center">
        <Label Height="23" Name="lblCaption" Width="20" VerticalAlignment="Center">aaa</Label>
        <local:PASCustomComboBox Height="23" x:Name="cmbComboBoxControl" VerticalAlignment="Center"  Width="50" 
                  IsEditable="True"  Style="{StaticResource comboBoxStyle}">
            </local:PASCustomComboBox>
        <Button Height="23" Name="btnSearch" Width="25" Click="btnSearch_Click" Visibility="Collapsed" 
                VerticalAlignment="Center">...</Button>
        <Label Height="23" Name="lblDescription" VerticalAlignment="Center" Width="20" Foreground="Blue">

        </Label>

    </Canvas>
</UserControl>

这里PASCustomComboBox是一个继承自组合框的类。

public class PASCustomComboBox : ComboBox
{
    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Down || e.Key == Key.Up)
        {
            e.Handled = true;
            return;
        }

        base.OnPreviewKeyDown(e);
    }
}

2 个答案:

答案 0 :(得分:2)

问题是你正在重新定义ControlTemplate而不包含任何可视树:

<Style x:Key="comboBoxStyle" TargetType="{x:Type local:PASCustomComboBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:PASCustomComboBox}">
                <ControlTemplate.Triggers>
                    <Trigger Property="local:PASCustomComboBox.IsEnabled" Value="false">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

你需要风格上的触发器而不是controltemplate:

<Style x:Key="comboBoxStyle" TargetType="{x:Type local:PASCustomComboBox}">
    <Style.Triggers>
        <Trigger Property="local:PASCustomComboBox.IsEnabled" Value="false">
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

答案 1 :(得分:0)

你没有在你的风格的控制模板中指定任何视觉元素,只是一个触发器。 它将呈现空模板iirc。

更好地编辑样式中ComboBox的Trigger集合以添加该触发器,并保留默认的ControlTemplate。