自定义控件在两个样式之间切换

本文关键字:样式 之间 两个 自定义控件 | 更新日期: 2023-09-27 18:09:24

我正在制作一个自定义控件,它有两个非常不同的样式需求。一个是基本款,另一个是高级款。

我的控件包含以下enum的依赖属性:

public enum ControlTypes
{
    Basic,
    Advanced
}

我在泛型中创建了两个样式。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;            
}

这两个样式总是空的。我不确定如何从generic.xaml内部获得样式。还是有更好的方式来交换我的风格?

自定义控件在两个样式之间切换

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

<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>

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