自定义控制在两种样式之间切换

时间:2011-09-22 00:54:44

标签: c# wpf custom-controls

我正在制作一个自定义控件,它有两种截然不同的造型需求。一个用于基本外观,另一个用于更高级的外观。

我的控件包含以下枚举的依赖项属性:

public enum ControlTypes
{
    Basic,
    Advanced
}

我在generic.xaml中创建了两个样式(模板非常不同),并给每个样式一个键。

在enum属性的更改处理程序中,我正在尝试查找样式并设置正确的样式。

private static void OnControlTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var myCustomControl = (MyCustomControl)d;

    var basicControlStyle = Application.Current.TryFindResource("BasicControlStyle") as Style;
    var advancedControlStyle = Application.Current.TryFindResource("AdvancedControlStyle") as Style;

    if (myCustomControl.ControlType == ControlTypes.Basic)
        myCustomControl.Style = basicControlStyle;
    else if (myCustomControl.ControlType == ControlTypes.Advanced)
        myCustomControl.Style = advancedControlStyle;            
}

这两种样式始终为null。我不确定如何从generic.xaml中获取样式。或者有更好的方式来交换我的风格吗?

1 个答案:

答案 0 :(得分:1)

删除OnControlTypePropertyChanged中的代码,并在XAML中输入类似的内容。请注意,我绑定了一个名为IsAdvanced的属性,因为它更易于测试,但您可以通过更改{x:Static namespace:nameofyourenum.Value}的“True”来绑定到枚举

<Style TargetType="local:SomeControl">
    <Style.Setters>
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:SomeControl">
                    <StackPanel>
                        <TextBlock Text="DefaultTemplate"></TextBlock>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
    <Style.Triggers>
        <Trigger Property="IsAdvanced" Value="True">
            <Trigger.Setters>
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="local:SomeControl">
                            <TextBlock Text="Advanced Template"></TextBlock>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger.Setters>
        </Trigger>
    </Style.Triggers>
</Style>

请注意,这仍然使使用您的控件的程序员能够完全覆盖控件模板并执行他们想要的操作。你原来的方法不允许这样做。